如何在 SQL Server 中正确比较两个可为空的 BIT 值?

jay*_*cer 3 sql-server

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 列?

Pரத*_*ீப் 5

用于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)