在 SQL Server 中处理 NULL

Raj*_*jan 0 sql-server-2008-r2

我在尝试处理空值时遇到问题。

这是例子

我有一张桌子

Create table Test_Table 
(
id int null,
pName varchar(10)
)
GO
Run Code Online (Sandbox Code Playgroud)

Id 列NULL有价值。

INSERT INTO Test_Table 
SELECT NULL, 'A' UNION 
SELECT NULL,'B' UNION 
SELECT NULL, 'C' UNION 
SELECT NULL,'D' 
GO
Run Code Online (Sandbox Code Playgroud)

现在,当我执行不同的 select 语句时,最后两个条件失败了。我可以ISNULL用来处理它,但我需要更改大约 500 个 SP。

所以,如果可能的话,我需要除此之外的解决方案。

SELECT * FROM Test_Table WHERE id is NULL --True

SET ANSI_NULLS OFF
SELECT * FROM Test_Table WHERE id=NULL --True


SET ANSI_NULLS OFF
SELECT * FROM Test_Table WHERE id=id --False. Why???

Declare @ID INT = 0

SET ANSI_NULLS OFF
Select case when @ID > 0 then @ID else id end as Statements, * 
From   Test_Table  
Where  ID = case when @ID > 0 then @ID else ID END -- Fails. Why??
Run Code Online (Sandbox Code Playgroud)

Id=NULL为真时,为什么Id=Id为假??

谢谢!

McN*_*ets 5

看看 MS Docs 关于IS NULL 的评论

备注
要确定表达式是否为 NULL,请使用 IS NULL 或 IS NOT NULL 代替比较运算符(例如 = 或 !=)。当一个或两个参数为 NULL 时,
比较运算符返回UNKNOWN

SET ANSI_NULLS MS Docs:

仅当比较的操作数之一是 NULL 变量或文字 NULL 时,SET ANSI_NULLS ON 才会影响比较。如果比较的两边都是列或复合表达式,设置不影响比较。

让我向您的表中添加一些其他记录:

INSERT INTO Test_Table 
VALUES (NULL, 'A'),(NULL,'B'),(NULL,'C'),(NULL,'D'),(1,'E'),(2,'F');
Run Code Online (Sandbox Code Playgroud)

现在,您的查询:

SET ANSI_NULLS OFF
SELECT * FROM Test_Table WHERE id=id;
Run Code Online (Sandbox Code Playgroud)

返回:

身份证 | 名称
-: | :----
 1 | 乙    
 2 | F    

对于您的第二个查询也是如此:

Declare @ID INT = NULL

SET ANSI_NULLS OFF
SELECT CASE WHEN @ID > 0 THEN @ID ELSE id END AS Statements, * 
FROM   Test_Table  
WHERE  ID = CASE WHEN @ID > 0 THEN @ID ELSE ID END
GO
Run Code Online (Sandbox Code Playgroud)
声明 | 身份证 | 名称
---------: | -: | :----
         1 | 1 | 乙    
         2 | 2 | F    

Null 表示缺少值,您必须使用 IS NULL 显式检查 NULL 值:

SET ANSI_NULLS OFF
SELECT * FROM Test_Table WHERE id IS NULL;
Run Code Online (Sandbox Code Playgroud)

dbfiddle在这里

  • 还有更多:条件“WHERE id=id OR id IS NULL”始终为真,可以完全省略! (2认同)