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

问题描述 投票:0回答:5

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

sql case-when snowflake
5个回答
2
投票

你的代码,不应该编译,所以我猜它不是实际的代码。 (1)在THEN之后缺少WHEN。 (2)值AB应用单引号括起来,否则它们将被识别为列名。 所以应该写成:

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然后返回FALSEIFF()部分,这是'NO'


0
投票

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

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

0
投票

这样做的另一种方式......

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

0
投票

为了安全起见,您最有可能还需要添加IS NULL支票。 我相信SQL标准定义NOT IN()不应该使用NULL值..

由于qazxsw poi与写qazxsw poi和qazxsw poi相同,永远不应该是真的。

询问

ColA  NOT IN('A','B')

0
投票
ColA <> 'A' OR ColB <> 'B'
© www.soinside.com 2019 - 2024. All rights reserved.