Sql 如何在包含空值和空值的两列上写入WHERE to equalize
给定了我的表结构,现在我需要编写一个查询来比较“STRVAL1和STRVAL2”和“BVAL1和BVAL2”,如果两者不相同,那么应该返回该行 预期结果 请使用下面的脚本获取数据Sql 如何在包含空值和空值的两列上写入WHERE to equalize,sql,sql-server,database,sql-server-2008-r2,qsqlquery,Sql,Sql Server,Database,Sql Server 2008 R2,Qsqlquery,给定了我的表结构,现在我需要编写一个查询来比较“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) ,
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
您可以只使用比较,尽管
NULL
s使这有点麻烦:
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)
);
选择t*
来自@tab t
其中((strval1-strval2)或
(strval1为空且strval2不为空)或
(strval1不为null,strval2为null)
)或
((bval1 bval2)或
(bval1为空,bval2不为空)或
(bval1不为空,bval2为空)
);
您将需要一组测试
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)
类似于使用ISNULL(字段“”)“”@Christopher-is正在考虑ISNULL和合并-但是如果非null端包含您的可选值怎么办-如果您合并到“N/A”,如果您合并到“N/A”,则会出错-另一个是位字段