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为假??
谢谢!
看看 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)
现在,您的查询:
Run Code Online (Sandbox Code Playgroud)SET ANSI_NULLS OFF SELECT * FROM Test_Table WHERE id=id;
返回:
身份证 | 名称 -: | :---- 1 | 乙 2 | F
对于您的第二个查询也是如此:
Run Code Online (Sandbox Code Playgroud)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
声明 | 身份证 | 名称 ---------: | -: | :---- 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在这里
归档时间: |
|
查看次数: |
104 次 |
最近记录: |