【问题标题】:Fill rows in column A with value of column B if condition in column A is met如果满足 A 列中的条件,则用 B 列的值填充 A 列中的行
【发布时间】:2021-03-14 18:50:17
【问题描述】:

我有一张这样的桌子:

colA    | colB
" "     | 1
"K 111" | 1
"K222"  | 2
" "     | 3

有些列只有一个空格(“”),有些列有“K {number}”,有些列有“K{number}”。

如果 colA 有一个空格,我希望将该值替换为 colB 中的值。

所以最终结果应该是:

colA    | colB
1       | 1
"K abc" | 1
"Kdef"  | 2
3       | 3

我该怎么做?

【问题讨论】:

    标签: sql oracle conditional-statements exasol


    【解决方案1】:

    您可以使用case 表达式:

    select (case when colA = ' ' then to_char(col_b)
                 else colA
            end) as new_colA
    

    如果你想更通用,你可以使用like

    select (case when colA like 'K%' then colA
                 else
            end) as new_colA
    

    update 中,您可以将when 条件移至过滤条件:

    update t
        set colA = to_char(colb)
        where colA = ' ';
    

    【讨论】:

    • 谢谢,第一个代码示例完美运行。
    【解决方案2】:

    您可以使用case 表达式:

    select 
        case when cola = ' ' then to_char(colb) else cola end as cola,
        colb
    from mytable
    

    请注意,case 表达式的所有分支都必须返回相同数据类型的值。 colb 似乎是一个数字,所以这会将其转换为字符串。

    【讨论】:

      【解决方案3】:

      或者,DECODE 函数(只是CASE 的替代品):

      SQL> with test (cola, colb) as
        2    (select 'K 111', 1 from dual union all
        3     select ' '    , 1 from dual union all
        4     select 'K222' , 2 from dual union all
        5     select ' '    , 3 from dual
        6    )
        7  select decode(cola, ' ', to_char(colb), cola) cola,
        8         colb
        9  from test;
      
      COLA             COLB
      ---------- ----------
      K 111               1
      1                   1
      K222                2
      3                   3
      
      SQL>
      

      【讨论】:

      • NVL 替换 NULL。在 OP 的数据模型中,它们使用单​​个空格表示 NULL。 NVL 不处理这个问题。也许您想先将cola 包装在某种NULLIF 调用中。
      • 啊,一个 space ... 看这个例子,我被包含“nothing”和 translated 的双引号愚弄了(在我的注意)好像它是一个NULL。完全错误。谢谢你,@mathguy。重写为 DECODE,作为 CASE 的替代。
      【解决方案4】:

      另一种选择是使用IS NULL检查更新值,如下所示:

      update your_table
         set colA = to_char(colB)
       where trim(colA) is null;
      

      Oracle中的空字符串被认为是null。

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        相关资源
        最近更新 更多