SQL Server 中的可为空 BIT 值有 3 个可能的值:null、0 和 1。我有两列都是可为空 BIT,我想知道它们何时“相等”(即 NULL“等于”a) NULL 和 1 等于 1 和 0 不“等于”NULL。但是,我所有的 CASE 陈述都未能给出我想要的答案。准确地进行这种比较的最佳方法是什么?
DECLARE @BitComparison TABLE
(
OldValue BIT,
NewValue BIT,
ActuallyEqual VARCHAR(10)
)
INSERT INTO @BitComparison (OldValue, NewValue, ActuallyEqual)
VALUES
(null,null,'equal'),
(null,0,'not equal'),
(null,1,'not equal'),
(0,null,'not equal'),
(0,0,'equal'),
(0,1,'not equal'),
(1,null,'not equal'),
(1,0,'not equal'),
(1,1,'equal')
SELECT *
, CASE WHEN OldValue <> NewValue then 'not equal' else 'equal' end as 'ComparisonTestA'
, CASE WHEN ISNULL(OldValue, 0) <> ISNULL(NewValue, 0) then 'not equal' else 'equal' end as 'ComparisonTestB'
, CASE WHEN ISNULL(OldValue, -1) <> ISNULL(NewValue, -1) then 'not equal' else 'equal' end as 'ComparisonTestC'
FROM @BitComparison
Run Code Online (Sandbox Code Playgroud)
根据上面的脚本,硬编码的 ActualEqual 列中的值都不与 ComparisonTest 列中的值匹配。我可以在 SELECT 中添加什么来动态匹配 ActualEqual 列?
用于IS NULL检查NULL
CASE
WHEN OldValue = NewValue
OR ( OldValue IS NULL AND NewValue IS NULL ) THEN 'equal'
ELSE 'not equal'
END AS 'ComparisonTestA'
Run Code Online (Sandbox Code Playgroud)