用不等于多个值的值替换列
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) 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 NOT IN('A','B')
将评估为 NULL
并且不会发生替换。
您可以使用 Snowflake 的 IFF()
函数编写语句,如下所示:
SELECT *, IFF(ColA IN ('A', 'B'), ColA, 'NO') NewColA
FROM dataset;
如果 ColA IN ('A', 'B')
的计算结果为 NULL
,则返回 IFF()
的 FALSE
部分,即 'NO'
如果列中的值不是 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) 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 NOT IN('A','B')
将评估为 NULL
并且不会发生替换。
您可以使用 Snowflake 的 IFF()
函数编写语句,如下所示:
SELECT *, IFF(ColA IN ('A', 'B'), ColA, 'NO') NewColA
FROM dataset;
如果 ColA IN ('A', 'B')
的计算结果为 NULL
,则返回 IFF()
的 FALSE
部分,即 'NO'