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

Sql 用不等于多个值的值替换列,sql,case-when,snowflake-cloud-data-platform,Sql,Case When,Snowflake Cloud Data Platform,如果列中的值不是a或B,则将该值替换为“否” 预期产出: 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; 它返回一列所有“否” replace()不需要,只需使用case表达式

如果列中的值不是a或B,则将该值替换为“否”

预期产出:

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; 
它返回一列所有“否”

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

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

另一种方法是

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

为了安全起见,您很可能还需要添加一个
IS NULL
检查
我认为在()中定义的SQL标准不应使用空值

由于
ColA不在('A','B')
与写入
ColA'A'或ColB'B'
相同,并且
SELECT'A'NULL
永远不应为true

查询

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

你的代码,不应该编译,所以我猜它不是实际的代码
(1) 当时,它在
之后
缺失
(2) 值
A
B
应该用单引号括起来,否则会被识别为列名
所以应该写为:

SELECT *, 
  CASE 
    WHEN ColA NOT IN('A','B') THEN REPLACE(ColA, ColA, 'NO') 
    ELSE ColA 
  END NewColA 
FROM dataset;
这将产生所需的结果,除非
ColA
中存在
NULL

NULL
的情况下,
ColA不在('A','B')
将计算为
NULL
,不会进行替换
您可以使用雪花的函数编写语句,如下所示:

SELECT *, IFF(ColA IN ('A', 'B'), ColA, 'NO') NewColA
FROM dataset;
如果
ColA In('A','B')
的计算结果为
NULL
,则返回
IFF()
FALSE
部分,即
'NO'

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