我有一些名为Students
的列的表。
我正在对select
行使用以下三个查询。
1. select * from Students
2. select * from Students where 1=1
3. select * from Students where null=null
当我先执行时,会返回所有行。
当我执行第二个时,这也会返回所有行。
但是当我执行第三个时,这不会返回任何行。
我有两个问题
- 什么是
1=1
和null=null
以及我们为什么要使用这些?- 第一次查询和第二次查询有什么区别?
醇>
答案 0 :(得分:4)
关于问题部分"为什么"使用这个:
由于1=1
总是评估为true
而true
是逻辑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=null
和or ...
提示:这种编码通常带有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条件 总是不起作用