如果满足 A 列中的条件,则用 B 列的值填充 A 列中的行

Fill rows in column A with value of column B if condition in column A is met

我有一个 table 喜欢:

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

有些列只有 space (" "),有些列有 "K {number}",有些有 "K{number}"。

如果 colA 有一个 space 我想用 colB 中的值替换那个值。

所以最终结果应该是:

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

我该怎么做?

您可以使用 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 = ' ';

您可以使用 case 表达式:

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

请注意,case 表达式的所有分支必须 return 相同数据类型的值。好像 colb 是一个数字,所以这会将它转换为一个字符串。

或者,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>

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

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

Oracle 中的空字符串被视为 null。