【问题标题】:How to write a WHERE to equate on two columns contains both NULL and empty values如何编写一个 WHERE 来等同于两列包含 NULL 和空值
【发布时间】:2016-11-11 12:04:07
【问题描述】:

鉴于是我的表结构,现在我需要编写一个查询来比较“STRVAL1 和 STRVAL2”,然后是“BVAL1 和 BVAL2”,如果两者不相同,则应返回该行。

预期结果...

请使用以下脚本获取数据

DECLARE @TAB TABLE (ID INT, STRVAL1 VARCHAR(8), STRVAL2 VARCHAR(8), BVAL1 BIT, BVAL2 BIT)

    INSERT INTO @TAB VALUES 
      (1, NULL, NULL, NULL, NULL)
    , (2, '', NULL, NULL, NULL)
    , (3, '', '', NULL, NULL)
    , (4, 'VAL', 'VAL', NULL, NULL)
    , (5, 'VAL1', 'VAL2', NULL, NULL)
    , (6, NULL, NULL, 0, NULL)
    , (7, NULL, NULL, 0, 0)
    , (8, NULL, NULL, 1, 1)
    , (9, NULL, NULL, 1, 0)

    SELECT ID, STRVAL1, STRVAL2, BVAL1, BVAL2
    FROM @TAB

【问题讨论】:

  • 类似使用 ISNULL(Field,'') ''
  • @Christopher - 正在考虑 ISNULL 和 COALESCE - 但是如果非空端包含您的替代值怎么办 - 如果您将 COALESCE 设置为“N/A”,如果您使用“N”则会出错/A' - 加上另一个是位字段

标签: sql sql-server database sql-server-2008-r2 qsqlquery


【解决方案1】:

你可以只使用比较,虽然NULLs 让这有点麻烦:

select t.*
from @tab t
where ((strval1 <> strval2) or
       (strval1 is null and strval2 is not null) or
       (strval1 is not null and strval2 is null)
      ) or
      ((bval1 <> bval2) or
       (bval1 is null and bval2 is not null) or
       (bval1 is not null and bval2 is null)
      );

【讨论】:

    【解决方案2】:

    您将需要组合测试。

    select ... from ... where
    (strval1 is null and strval2 is not null) or
    (strval1 is not null and strval2 is null) or
    (strval1 != strval2) or
    (bval1 is null and bval2 is not null) or
    (bval1 is not null and bval2 is null) or
    (bval1 != bval2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      相关资源
      最近更新 更多