如果列中的值不是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”的列。
你的代码,不应该编译,所以我猜它不是实际的代码。
(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
的IFF()
部分,这是'NO'
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标准定义NOT IN()
不应该使用NULL值..
由于qazxsw poi与写qazxsw poi和qazxsw poi相同,永远不应该是真的。
询问
ColA NOT IN('A','B')
ColA <> 'A' OR ColB <> 'B'