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

时间:2015-01-31 09:09:44

标签: sql sql-server

我有一些名为Students的列的表。

我正在对select行使用以下三个查询。

 1. select * from Students
 2. select * from Students where 1=1
 3. select * from Students where null=null

当我先执行时,会返回所有行。

当我执行第二个时,这也会返回所有行。

但是当我执行第三个时,这不会返回任何行。

我有两个问题

  
      
  1. 什么是1=1null=null以及我们为什么要使用这些?
  2.   
  3. 第一次查询和第二次查询有什么区别?
  4.   

6 个答案:

答案 0 :(得分:4)

关于问题部分"为什么"使用这个:
由于1=1总是评估为truetrue是逻辑AND操作的中性元素,因此它通常用于动态构建的查询。

在某些条件下,对查询添加或不使用多个AND操作的动态构建查询的问题是,您必须跟踪它是first条件添加或不。 (即SELECT * FROM mytable WHERE AND bla = 'blub'无效;我们必须在添加到查询中的第一个条件时取消AND

当我们将查询基础更改为SELECT * from mytable WHERE 1=1时,可以避免所有这些。现在我们可以动态添加AND条件,而不考虑它是否是添加的第一个条件。 (即SELECT * FROM mytable WHERE 1=1 AND bla = 'blub'有效)

答案 1 :(得分:2)

如果您放置ANSI_NULL off,则会返回true。如果它是on那么它将返回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'

参考来自Null=Null

@Jarlh如果我设置ansi_nulls off

当您设置ansi_nulls off时,它会告诉您不要关注ANSI standerds来比较null值 那么这个查询将导致所有行。

set ansi_nulls off

select * from cust_data where null=null

答案 2 :(得分:2)

  • 1=1永远是真的
  • null=null始终为假

当一些代码动态地向给定查询的where子句添加条件时,通常会使用这些构造。

使用where 1=1代码可以简单地添加and ...限制,而无需检查这是否是第一个限制。

where null=nullor ...

也是如此

提示:这种编码通常带有SQL查询的文本处理(而不是结构处理)。当你看到这样的代码时,请注意SQL注入!

答案 3 :(得分:1)

第一个查询只返回表的所有行。

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

最后一个查询再次仅返回与WHERE clause匹配的行。由于此条件始终为false,因此根本不会返回任何行。

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

SELECT * 
FROM Students WHERE NULL IS NULL

IS operator可让您比较NULL值,因此此查询将再次返回所有行。这是一般规则:永远不要使用=来检查NULL

答案 4 :(得分:1)

这是最简单的逻辑,因为当你比较空值时,1 = 1总是为真,2个空值不相同。

其中condition用于按列值过滤数据,如果我们给出1 = 1,它的逻辑过滤器,则返回所有内容。当我们给出1 = 2时,它什么都没有(只是想想为什么)。

select * from Students
select * from Students where 1=1

因此,您的前2个查询是相同的,这就是为什么它会给出相同的结果。

select * from Students where null = null 

它显然给出了0行,因为在比较方面,null都是不同的,并且条件不是fullfill。

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

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

答案 5 :(得分:1)

First和Second给出相同的结果。

但是1 = 1和null = null不相同。 1 = 1始终为TRUE,但null = null不是。

Null"未知"或"不存在"。在那种情况下,你无法判断错误情况的真实性。

如果你想让它永远成真,那么你可以使用这个

set ansi_nulls off

并检查此

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

并且您的第三个查询也可以将其切换为OFF。 默认情况下,它设置为ON条件 总是不起作用