部分参考文章:

    https://www.bbsmax.com/A/A7zgEOVl54/  [BBSMAX]Lumia1020 2022-11-08

    https://www.cnblogs.com/SFAN/p/4343703.html cnblogs @ sunnyboy 2015-03-17 10:17

  wikipedia三值逻辑:https://zh.wikipedia.org/wiki/%E4%B8%89%E5%80%BC%E9%80%BB%E8%BE%91

  SET ANSI_NULLS (Transact-SQL):https://learn.microsoft.com/zh-cn/sql/t-sql/statements/set-ansi-nulls-transact-sql?redirectedfrom=MSDN&view=sql-server-ver16

NULL :在 C#、Java 语言中,NULL 作为一个值(引用类型字段默认初始值,注意区别 NULL、空字符串区别),代表未指向内存堆空间中任何对象(此处,就不在细讲,可以去详细了解一下基本类型、引用类型在内存堆栈上存储区别)。而在数据库中,NULL 同样作为一个值,其含义可以理解为:NULL 表示该字段值不知道,而并不是代表字段没有值。

下表来自维基百科,有关 NULL、TRUE、FALSE 参与 OR AND 非运算逻辑结果

IS NULL、IS NOT NULL

平时在写 SQL 语句时,注意 = NULL、<> NULL 应为 IS NULL、IS NOT NULL,避免出现不必要错误。

NULL 在聚合函数 SUM、COUNT、MAX、MIN 中处理

  在数据库中,NULL 同样作为一个值,而 NULL 值进行四则运算时, NULL+1、NULL*2诸如之类,得到最终结果都为 UNKNOW。还有 NULL >23 等比较运算时,同样得到的结果为三值逻辑中的 UNKNOW。

  综上所述,SUM、MAX、MIN 三者中都包括运算比较,在运算中如果 NULL 值参与其中,最终结果将为 UNKNOW。因此,在进行 SUM、MAX、MIN 聚合时,将会舍弃 NULL 值。

  而 COUNT 较为特殊, COUNT(*) 将会包含有 NULL 值行记录,COUNT(字段名) 刚将不会包含该字段含有 NULL 值行记录,而 COUNT( DISTINCT 字段名)将舍弃该字段含有 NULL 值且不重复的行记录。

SET ANSI_NULLS ON

  当 ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。 即使 column_name 中包含非空值,使用 WHERE column_name<>NULL 的 SELECT 语句仍返回零行。

  当 ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵守 ISO 标准。 使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。 使用 WHERE column_name<>NULL 的 SELECT 语句返回列中包含非空值的行。 此外,使用 WHERE column_name<>XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行 。

  当 ANSI_NULLS 为 ON 时,所有对 null 值的比较均取值为 UNKNOWN。 当 SET ANSI_NULLS 为 OFF 时,如果数据值为 NULL,则所有数据对空值的比较将取值为 TRUE。 如果未指定 SET ANSI_NULLS,则应用当前数据库的 ANSI_NULLS 选项设置。 有关 ANSI_NULLS 数据库选项的详细信息,请参阅 ALTER DATABASE (Transact-SQL)

  下表显示 ANSI_NULLS 的设置如何通过 NULL 值和非 NULL 值影响大量布尔表达式的结果。

布尔表达式 SET ANSI_NULLS ON SET ANSI_NULLS OFF
NULL = NULL UNKNOWN TRUE
1 = NULL UNKNOWN FALSE
NULL <> NULL UNKNOWN FALSE
1 <> NULL UNKNOWN TRUE
NULL > NULL UNKNOWN UNKNOWN
1 > NULL UNKNOWN UNKNOWN
NULL IS NULL TRUE TRUE
1 IS NULL FALSE FALSE
NULL IS NOT NULL FALSE FALSE
1 IS NOT NULL TRUE TRUE

  仅当某个比较操作数是值为 NULL 的变量或文字 NULL 时,SET ANSI_NULLS ON 才会影响比较。 如果比较双方是列或复合表达式,则该设置不会影响比较。

  为使脚本按预期运行,不管 ANSI_NULLS 数据库选项或 SET ANSI_NULLS 的设置如何,请在可能包含空值的比较中使用 IS NULL 和 IS NOT NULL。

  在执行分布式查询时应将 ANSI_NULLS 设置为 ON。

  针对计算列或索引视图创建或更改索引时,ANSI_NULLS 也必须为 ON。 如果 SET ANSI_NULLS 为 OFF,则针对表(包含计算列或索引视图的索引)的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。 SQL Server 将返回一个错误消息,该错误消息会列出所有违反所需值的 SET 选项。 另外,在执行 SELECT 语句时,如果 SET ANSI_NULLS 为 OFF,则 SQL Server 忽略计算列或视图的索引值并解析选择操作,就好像表或视图没有这样的索引一样。

Transact-SQL 支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE。

通过设置 ANSI_NULLS OFF 可将此选项激活。
当 ANSI_NULLS 为 OFF 时,
如果 ColumnA 包含 Null 值,则 ColumnA = NULL 之类的比较操作会返回 TRUE;
如果 ColumnA 除了包含 NULL 外还包含某些值,则这类比较操作将返回 FALSE。
比较计算结果为 NULL 的两个表达式也会返回 TRUE。

ANSI_NULLS 设置不影响包含 NULL 的联接列。联接列中包含 NULL 的行不是结果集的一部分。

NULL值引入导致新增的unknown逻辑值 以及 SQL server中ANSI_NULLS的使用的更多相关文章

  1. SQL 之 SQL server 中 遇到字段的值为null 遇到的坑

    SQL server 中,如果查询或筛选的条件中,某字段的值为NULL,如何处理?又有哪些坑需要避免呢? 直接上坑 : NULL 与其他任何类型进行逻辑判断: [解释]: NULL表示值未知,和空字符 ...

  2. sql server中NULL导入decimal字段时报错

    sql server中NULL导入decimal字段时报错 在导入CSV文件时,如果decimal字段为null值,导致文本文件入库时失败. 错误现象 构造例子 新建一张表,包含decimal字段. ...

  3. SQL Server中TOP子句可能导致的问题以及解决办法

    简介      在SQL Server中,针对复杂查询使用TOP子句可能会出现对性能的影响,这种影响可能是好的影响,也可能是坏的影响,针对不同的情况有不同的可能性.      关系数据库中SQL语句只 ...

  4. SQL SERVER中什么情况会导致索引查找变成索引扫描

    SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致 ...

  5. SQL Server中可能为null的变量逻辑运算的时候要小心

    DECLARE @a int declare @b int IF(@a<>@b) print('@a<>@b') else print('@a=@b') ) print('b& ...

  6. SQL Server中NULL的一个测试

    我们都知道SQL Server中NULL是一个很特殊的存在,因为NULL不会等于任何值,且NULL也不会不等于任何值.对于NULL我们只能使用IS或IS NOT关键字来进行比较. 我们先来看看下面一个 ...

  7. SQL SERVER 中is null 和 is not null 将会导致索引失效吗?

    其实本来这个问题没有什么好说的,今天优化的时候遇到一个SQL语句,因为比较有意思,所以我截取.简化了SQL语句,演示给大家看,如下所示 declare @bamboo_Code varchar(3); ...

  8. SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析

    在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index ...

  9. SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的一种解决方案

    parameter sniff问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象.想必熟悉数据的同学都应该知道,产生parameter sniff最典型的问题就是使用了参数化的 ...

  10. .NET和SQL Server中“空值”辨析 (DBNull与Null的区别)

    对表进行插入操作,如datetime和int类型的两个字段,都允许为null,用“sqlcmd.Parameters.Add("@t12",tb12.Text)”参数绑定时.dat ...

随机推荐

  1. 基于CentOS Stream 8的物联网数据采集与展示方案

    系统架构全景图 图表 一.系统平台优化(CentOS Stream 8) 1. 系统基础配置 bash # 1. 系统更新与加固 sudo dnf update -y sudo dnf install ...

  2. CF650A 题解

    Problem 原题链接 Meaning 求曼哈顿距离和欧氏距离相等的坐标组数量. Solution 这道题用枚举复杂度较高,我们考虑探究当两点的曼哈顿距离与欧氏距离相等时,它们横纵坐标的关系. 如下 ...

  3. Xamarin.Android 禁止横屏 /竖屏

    this.RequestedOrientation = Android.Content.PM.ScreenOrientation.Portrait;//竖屏,禁止横屏 this.RequestedOr ...

  4. SqlServer 查看所有触发器信息的命令

    https://blog.csdn.net/chenghaibing2008/article/details/45332993 SELECT       object_name(a.parent_ob ...

  5. C# winfrom 通过代码 控件 TableLayoutPanel的行或列 删除 隐藏

    删除 tableLayoutPanel1.ColumnStyles.RemoveAt(1);                tableLayoutPanel1.Controls.RemoveAt(1) ...

  6. 485集线器 4口485集线器 4口485 HUB

    485集线器ZLAN9440是一款上海卓岚生产的可通过一路RS485/232主口扩展出4路RS485从口的工业级隔离型4口RS485集线器.可以有效的实现RS485网络的中继.扩展与隔离.ZLAN94 ...

  7. 微信小程序 物联网解决方案

    "卓岚物联"微信小程序是方便地查看物联网设备当前数据.历史数据.控制设备的简单有效的方法.查看和控制设备的实现可以在五分钟内完成,简单易用."卓岚物联"微信程序 ...

  8. nginx代理http2服务

    NGINX 不支持HTTP/2 到后端(至少目前nginx v1.27.1不支持),这从官方文档中可以看出,支持后端的最高 HTTP 版本为 v1.1. 其实添加此类支持实际上没有什么意义,因为HTT ...

  9. 调试栈 linux

    参考连接 bluez 中有对于backtrace 的使用.所以看了一下这篇文章比较好.转载了 参考:CSDN大牛

  10. python 将数组写入文件

    简介 常用功能 code import numpy as np import time test_data = np.random.rand(6000000,12) T1 = time.time() ...