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

Replace column with values not equal to multiple values

如果列中的值不是 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; 

它returns一栏全部"NO"。

不需要

replace() 只需使用 case 表达式:

select d.*, (case when cola in ('a', 'b')
                  then cola else 'NO'
             end)
from dataset d;
SELECT 
CASE WHEN ColA NOT LIKE 'A' OR 'B' THEN 'NO' ELSE ColA END AS 'ColA'
,ColB
FROM Dataset;

另一种方法...

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

为了安全起见,您很可能还需要添加一个 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

您的代码应该无法编译,所以我猜这不是实际代码。
(1)WHEN.
后少了THEN (2) AB 的值应该用单引号引起来,否则会被识别为列名。
所以应该写成:

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

这将产生预期的结果,除非 ColA 中有 NULL 值。
NULL 的情况下,ColA NOT IN('A','B') 将评估为 NULL 并且不会发生替换。
您可以使用 SnowflakeIFF() 函数编写语句,如下所示:

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

如果 ColA IN ('A', 'B') 的计算结果为 NULL,则返回 IFF()FALSE 部分,即 'NO'