A   B   C    Equal
1   1   1    Y
2   2   NULL N

你好,我有 3 列需要比较:A、B、C 列。如果这 3 列相同,则列 'Equal' = 'Y'

但是,如果一列为空,则必须将其排除在比较之外,例如在示例中,第 2 行有一个 null,但其余列都相同,因此 Equal 应该为 yes - 因为所有非 null 值都相等

http://www.sqlfiddle.com/#!3/dedd9/2

我以为我可以使用 isnull(C,A) = A 但它不起作用。有人可以帮忙吗

 declare @t table
 (
 A decimal,B decimal, C decimal
 )

 insert Into @t(A,B,C) values (1,1,1)
 insert Into @t(A,B) values (2,2)

 select A,B,C,'Equal' = case when ISNULL(A,B) = B and ISNULL(B,C) = C and ISNULL(C,A) = A then 'Y' else '' end
 from @t
有帮助吗?

解决方案

另一种方式,可以很容易地扩展到超过3列:

SELECT a, b, c,
       Equal = ( SELECT r = CASE WHEN MIN(v) = MAX(v) THEN 'Y'  -- all non-null values equal
                                 WHEN MIN(v) < MAX(v) THEN 'N'  -- at least 2 non equal 
                                 ELSE 'Y'                       -- all nulls
                            END 
                 FROM (VALUES (a), (b), (c)) AS x (v)
               ) 
FROM t ;
.

sql-fiddle

其他提示

假设你想要全部 NULLs 算作平等,我认为这会起作用。但我还没有彻底测试过,甚至没有思考很长时间......

 select A,B,C,'Equal' = 
    case when COALESCE(A,B,C,0) = COALESCE(B,C,A,0)
          and COALESCE(B,C,A,0) = COALESCE(C,A,B,0)
     then 'Y' else '' end
 from @t

COALESCE 将选择第一个非NULL 来自其参数的值,因此在测试时 A 反对 B 进而 B 反对 C, ,在每种情况下,我们都“期待”非NULL 值,当它们全部存在时有一个后备 NULL

你几乎是你的查询。但是,当验证ISnull(a,b)= b时,您的查询失败,当b为null时,由于null 在sql中没有等于null。

试试:

 declare @t table
 (
 A decimal,B decimal, C decimal
 )

 insert Into @t(A,B,C) values (1,1,1)
 insert Into @t(A,B) values (2,2)
 insert Into @t(A,C) values (2,2)
 insert Into @t(A,C) values (2,3)
 insert Into @t(A,B,C) values (2,2,3)


select 
  A
, B
, C
, 'Equal' = case when ISNULL(A,B) = ISNULL(B, A)
                  and ISNULL(B,C) = ISNULL(C, B)
                  and ISNULL(C,A) = ISNULL(A, C)
            then 'Y' else '' end
 from @t
.

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top