用不等于多个值的值替换列

时间:2019-05-01 15:09:25

标签: sql case-when snowflake

如果列中的值不是A或B,则将该值替换为“ NO”。

dataset

ColA     ColB
   A        L
NULL        P
   B        M
   C        G

预期输出:

ColA     ColB
   A        L
  NO        P
   B        M
  NO        G

我尝试过但没有运气:

SELECT *, 
CASE WHEN ColA NOT IN(A,B) REPLACE (ColA, ColA, 'NO') 
ELSE ColA 
END ColA 
FROM dataset; 

它返回全为“ NO”的列。

5 个答案:

答案 0 :(得分:2)

您的代码不应编译,因此我猜它不是实际的代码。
(1)在THEN之后缺少WHEN
(2)值AB应该用单引号引起来,否则它们将被识别为列名。
因此应写为:

SELECT *, 
  CASE 
    WHEN ColA NOT IN('A','B') THEN REPLACE(ColA, ColA, 'NO') 
    ELSE ColA 
  END NewColA 
FROM dataset;

除非NULL中有一个ColA值,否则这将产生期望的结果。
对于NULLColA NOT IN('A','B')将评估为NULL,并且不会进行替换。
您可以使用 Snowflake IFF()函数来编写语句,如下所示:

SELECT *, IFF(ColA IN ('A', 'B'), ColA, 'NO') NewColA
FROM dataset;

如果ColA IN ('A', 'B')的值为NULL,则返回FALSE的{​​{1}}部分,即IFF()

答案 1 :(得分:0)

只需使用replace()表达式就不需要

case

select d.*, (case when cola in ('a', 'b')
                  then cola else 'NO'
             end)
from dataset d;

答案 2 :(得分:0)

SELECT 
CASE WHEN ColA NOT LIKE 'A' OR 'B' THEN 'NO' ELSE ColA END AS 'ColA'
,ColB
FROM Dataset;

答案 3 :(得分:0)

另一种方法...

SELECT Col1, Col2, ColN,
       CASE
         WHEN ColA = 'A' OR ColA = 'B' THEN ColA
         ELSE NULL
       END AS ColA
FROM   dataset   

答案 4 :(得分:0)

为了安全起见,您很可能还需要添加IS NULL支票。
我相信SQL标准定义的NOT IN()不能与NULL值一起使用。

由于ColA NOT IN('A','B')与写入ColA <> 'A' OR ColB <> 'B'相同,因此SELECT 'A' <> NULL永远都不能不正确。

查询

SELECT 
  (
    CASE
      WHEN ColA NOT IN('A','B') OR ColA IS NULL
      THEN 'NO'
      ELSE ColA
    END
  ) AS ColA
  , ColB
FROM 
 dataset