匹配行中的 3 列 - 如果一列为空,则将其从比较中排除
-
11-12-2019 - |
题
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 ;
.
其他提示
假设你想要全部 NULL
s 算作平等,我认为这会起作用。但我还没有彻底测试过,甚至没有思考很长时间......
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