sql server中的“where 1=1”和“where null=null”是什么

sql server中的“where 1=1”和“where null=null”是什么,sql,sql-server,Sql,Sql Server,我有一个名为Students的列表 我使用以下三个查询来选择行 当我首先执行时,它将返回所有行 set ansi_nulls off select * from cust_data where null=null 当我执行second时,这也是返回所有行 set ansi_nulls off select * from cust_data where null=null 但是当我执行第三个命令时,它不会返回任何行 我有两个问题 什么是1=1和null=null?我们为什么要使用它们? 第

我有一个名为Students的列表

我使用以下三个查询来选择行

当我首先执行时,它将返回所有行

set ansi_nulls off

select * from cust_data where null=null
当我执行second时,这也是返回所有行

set ansi_nulls off

select * from cust_data where null=null
但是当我执行第三个命令时,它不会返回任何行

我有两个问题

什么是1=1和null=null?我们为什么要使用它们? 第一个查询和第二个查询的区别是什么?
第一个查询只返回表中的所有行

第二个查询只返回与WHERE子句匹配的行。由于where子句始终为true,因此它返回所有行

set ansi_nulls off

select * from cust_data where null=null
最后一个查询再次只返回与WHERE子句匹配的行。由于此条件始终为false,因此它根本不返回行

对于最后一个查询,您可以尝试:

SELECT * 
FROM Students WHERE NULL IS NULL
IS运算符允许比较空值,因此此查询将再次返回所有行。这是一条一般规则:永远不要使用=检查NULL。

如果您将ANSI\u NULL设置为off,则它将返回true。如果启用,则返回false

set ansi_nulls off

if null = null
    print 'true'
else
    print 'false'


set ansi_nulls ON

if null = null
    print 'true'
else
    print 'false'
参考资料来自

@Jarlh如果我设置ansi_空值

当您将ansi_null设置为off时,它会告诉您不要遵循ansi标准来比较null值 然后此查询将生成所有行

set ansi_nulls off

select * from cust_data where null=null

这是最简单的逻辑,因为在比较空值时,1=1始终为真,2空值不相同

其中,条件用于按列值过滤数据,如果我们给出1=1,则返回其逻辑过滤器,然后返回所有内容。当我们给1=2时,它什么也不给,想想为什么

select * from Students
select * from Students where 1=1
所以前两个查询是相同的,这就是为什么它给出相同的结果

select * from Students where null = null 
它显然给出了0行,因为两个null在比较方面是不同的,并且条件不是fullfill

试试这个,找出它作为前2个查询给出的逻辑

select * from Students where isnull(null,'') = isnull(null ,'')

第一个和第二个给出相同的结果

但是1=1和null=null不一样。1=1始终为真,但null=null不为真

Null未知或不存在。在这种情况下,你无法判断情况的真假

如果你想让它永远成为现实,那么你可以用这个

set ansi_nulls off
看看这个

if null = null
    print 'true'
else
    print 'false'
您的第三个查询也可以通过将其关闭来工作。 默认情况下,它设置为ON条件 这总是不起作用

1=1总是正确的 null=null始终为false 当一些代码向给定查询的where子句动态添加条件时,通常会使用这些结构

当1=1时,代码可以简单地添加限制和。。。不必检查这是否是第一个限制

如果null=null和或


提示:这种编码通常伴随SQL查询的文本处理而来,而不是结构处理。当您看到这样的代码时,请注意SQL注入

关于为什么使用此选项的问题部分: 由于1=1的计算结果始终为true,并且true是逻辑and操作的中性元素,因此它通常用于动态生成的查询

在某些条件下,动态生成的查询使用多个AND操作添加或不添加到查询中,问题在于您必须跟踪它,这是添加或不添加的第一个条件。i、 e.从mytable中选择*,其中和bla='blub'无效;我们必须在向查询中添加第一个条件的情况下抑制AND


当我们将查询基更改为从mytable中选择*时,所有这些都可以避免,其中1=1。现在,我们可以动态地添加和条件,而不考虑它是否是添加的第一个条件。i、 e.从mytable中选择*,其中1=1且bla='blub'有效

这可能有助于您找到正确的方向如果ansi_null打开,null=null将给出false。@POHH,我只是好奇,如果ansi_null关闭怎么办?@jarlh这将帮助您该条件未知,并且不会返回任何行。同样,我猜最后一个查询的用途是用OR?@VincentvanderWeele Yes扩展它,因为false是逻辑OR操作的中性元素。但由于各种原因,null=null并不理想。首先,它是一种特殊的东西,可以配置为评估为真或假。其次,相同的东西aroung=计算为false是不直观的。在需要OR操作的中性元素的情况下,我更喜欢使用1=0而不是null=null。