如果列中的值不是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”的列。
答案 0 :(得分:2)
您的代码不应编译,因此我猜它不是实际的代码。
(1)在THEN
之后缺少WHEN
。
(2)值A
和B
应该用单引号引起来,否则它们将被识别为列名。
因此应写为:
SELECT *,
CASE
WHEN ColA NOT IN('A','B') THEN REPLACE(ColA, ColA, 'NO')
ELSE ColA
END NewColA
FROM dataset;
除非NULL
中有一个ColA
值,否则这将产生期望的结果。
对于NULL
,ColA 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