惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

AI
AI
TaoSecurity Blog
TaoSecurity Blog
H
Heimdal Security Blog
Help Net Security
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Microsoft Azure Blog
Microsoft Azure Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
N
News | PayPal Newsroom
V2EX - 技术
V2EX - 技术
博客园 - 【当耐特】
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Secure Thoughts
C
CERT Recently Published Vulnerability Notes
罗磊的独立博客
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
有赞技术团队
有赞技术团队
S
Schneier on Security
S
SegmentFault 最新的问题
Google Online Security Blog
Google Online Security Blog
H
Hacker News: Front Page
The Last Watchdog
The Last Watchdog
Schneier on Security
Schneier on Security
PCI Perspectives
PCI Perspectives
IT之家
IT之家
Project Zero
Project Zero
博客园 - 司徒正美
P
Privacy International News Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Jina AI
Jina AI
Security Latest
Security Latest
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
V
Vulnerabilities – Threatpost
W
WeLiveSecurity
NISL@THU
NISL@THU
Webroot Blog
Webroot Blog
N
Netflix TechBlog - Medium
L
Lohrmann on Cybersecurity

博客园 - 李计刚

怎样定制图表提示? 要生就生双胞胎~ 如何手写代码以生成Composite图表? 在重庆访古~ Infragistics控件在VS.net 2005中使用的注意事项 UltraChart中如何自定义标签? 关于ColumnLine Chart 重庆印象! 用图表向导生成ColumnLineChart 在VS2005中调试JavaScript 那些逝去的美好日子! 关于SELECT执行顺序的问题! Infragistics中Custom Layer的实现(翻译) UltraChart绑定数据的问题(翻译) 韩剧已不再风光! 用颜色矩阵实现的图象反转效果 关于:GDI+FAQ的好去处! 我做的数字图象处理 我的Blog开通了!
SQL学习笔记之ANSI_NULLS
李计刚 · 2009-06-08 · via 博客园 - 李计刚

SET ANSI_NULLS{ON|OFF}:用来指定对空值使用等于(=)和不等于(<>)比较运算符时,这些运算符应遵从什么行为.具体是什么样的行为呢?SQL-92要求如下:
SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE,是默认值。
当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。
当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中含有空值的行;使用 WHERE column_name <> NULL 的 SELECT 语句返回列中含有非空值的行;使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有非 XYZ 值和非 NULL的行。

SQL Server联机丛书关于ANSI_NULLS里有这样一个代码示例,给出了直观的效果,我添加了输出提示,如下:
-- Create table t1 and insert values.
CREATE TABLE t1 (a INT NULL)
INSERT INTO t1 values (NULL)
INSERT INTO t1 values (0)
INSERT INTO t1 values (1)
GO

-- Print message and perform SELECT statements.
PRINT 'Testing default setting'
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname     --结果为空
SELECT *
FROM t1
WHERE a <> @varname    --结果为空
SELECT *
FROM t1
WHERE a IS NULL        --结果为NULL
GO

-- SET ANSI_NULLS to ON and test.
PRINT 'Testing ANSI_NULLS ON'
SET ANSI_NULLS ON
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname     --结果为空
SELECT *
FROM t1
WHERE a <> @varname    --结果为空
SELECT *
FROM t1
WHERE a IS NULL        --结果为NULL
GO

-- SET ANSI_NULLS to OFF and test.
PRINT 'Testing SET ANSI_NULLS OFF'
SET ANSI_NULLS OFF
GO
DECLARE @varname int
SELECT @varname = NULL 
SELECT *
FROM t1
WHERE a = @varname     --结果为NULL
SELECT *
FROM t1
WHERE a <> @varname    --结果为0,1
SELECT *
FROM t1
WHERE a IS NULL        --结果为NULL
GO

-- Drop table t1.
DROP TABLE t1

从上面代码的运行效果来看:
①当SET ANSI_NULLS ON时, =null或 <> null的查询条件时,结果都为空;如果为 IS NULL 才能显示NULL的行。
②不对ANSI_NULLS进行设置时,其执行效果与SET ANSI_NULLS ON时的效果一致,此处与SQL-92的要求之一“SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE,是默认值。”冲突哦?!
又怎么理解这个问题呢?
SQL Server联机丛书里ANSI_NULLS的知识文档里有答案:“SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_NULLS 设置为 ON。该设置可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性(它们在连接到 SQL Server 之前在应用程序中设置)中进行配置。”

PS:其实,实际使用过程中,我们并没有考虑ANSI_NULLS是被设置为ON还是False,我们对空值的处理都是IS NULL 或者 IS NOT NULL