首页 > 数据库 >NULL值引入导致新增的unknown逻辑值 以及 SQL server中ANSI_NULLS的使用

NULL值引入导致新增的unknown逻辑值 以及 SQL server中ANSI_NULLS的使用

时间:2023-04-19 14:37:52浏览次数:49  
标签:SET FALSE unknown NULLS server ANSI NULL TRUE

部分参考文章:

    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 ONSET 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 的行不是结果集的一部分。

标签:SET,FALSE,unknown,NULLS,server,ANSI,NULL,TRUE
From: https://www.cnblogs.com/SutsuharaYuki/p/17333173.html

相关文章

  • SQL Server 中易混淆的数据类型
    SQLServer中易混淆的数据类型 近来在做数据库设计,有时候真弄不清SQL2000里的数据类型,所以摘了这篇文章。(1)char、varchar、text和nchar、nvarchar、ntextchar和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,......
  • VB调用sql server 的数据转换服务(DTS)
    先在sqlserver的数据转换服务(DTS)中新建DTS包,保存为*.dts文件,VB中调用一下即可。    注:工程--引用---MicrosoftDTSPackage....选中。    -------------------------------------------------- PrivateSubRunPackage(ByValSAsString)'S......
  • SQL Server和Oracle常用函数对比
    SQLServer和Oracle常用函数对比SQLServer和Oracle是大家经常用到的数据库,在此感谢热心网友总结出这些常用函数以供参考。数学函数1.绝对值S:selectabs(-1)valueO:selectabs(-1)valuefromdual2.取整(大)S:selectceiling(-1.001)valueO:......
  • sql server的cube操作符使用详解[转]
    sqlserver的cube操作符使用详解cube操作符  要使用cube,首先要了解groupby  其实cube和rollup区别不太大,只是在基于groupby子句创建和汇总分组的可能的组合上有一定差别,  cube将返回的更多的可能组合。如果在groupby子句中有n个列或者是有n个表达式的话,  sqlserv......
  • linux-Jumpserver
    Jumpserver一、跳板机概述日常普通运维:运维管理与维护环境,一般通过远程连接工具,进行去维护与管理,好处方便.缺点不方便进行行为审计(什么时间什么地点,做了什么),批量管理较难自动化运维与管理:推荐通过跳板机连接用户管理服务器,进行批量管理可以利用自动化工具(......
  • SQL Server占用内存不释放卡死问题
      最近项目中发现使用SQLServer的机器会出现10天左右占满内存卡死情况,百度后发现对应的原因如下:    即:SQLServer内存管理是分配了最大内存是多少,就会使用多少,在再次使用的时候,才会释放掉空闲的内存,它不会主动全部释放掉所有空闲内存。所以解决方式是:在sqlSe......
  • ArcGIS Portal/Server局域网域名访问问题
    安装好arcgisportal后,假设:门户url:https://esrichina.arcgiscloud.com/arcgis/home/ip:10.0.3.159则需要修改host进行域名访问,找到C:\Windows\System32\drivers\etc下的HOSTS文件,打开HOSTS文件在文件最下面新加一行:10.0.3.159esrichina.arcgiscloud.com由于Windows的自我保护设置......
  • 记录一下工作中遇见的geoserver项目编译不成功和开源团队沟通解决问题的bug
    文件地址:org.geoserver.wcs.kvp.rangesubset.AbstractContentNode最近公司需要一些geoserver的定制化修改开发,但是在build项目的时候,发现这个Node是没有import的,我网上看了下,有的是直接引入的上面我注释掉的,---这是错误的做法,我根据这个问题和开源官方直接沟通得知是使用的下面......
  • SQL Server Endpoint 与 镜像、AlwaysOn身份验证
    若要加入 AlwaysOn可用性组 或数据库镜像,服务器实例上必须创建自己专用的“数据库镜像端点”(databasemirroringendpoint)。 此端点用途特殊,专门用于接收来自其他实例的连接。数据库镜像端点使用TCP协议在参与数据库镜像会话或承载可用性副本的实例之间发送和接收消息。 数......
  • sqlserver 分布式可用性组(二)—— 创建、故障转移与元数据信息查看方法
     一、创建规划准备工作与普通创建两个AG没有区别,以下是DAG规划:ProductionDRWSFCOS:WindowsServer2016OS:WindowsServer2016Nodes:WSFC-DC1-NODE1andWSFC-DC1-NODE2Nodes:WSFC-DC2-NODE1andWSFC-DC2-NODE2ClusterNameObject:WSFC-DC1ClusterNameObject:WSFC-DC2......