【问题标题】:What is 'where 1=1' and 'where null=null' in sql server什么是 'where 1=1' 和 'where null=null' 在 sql server
【发布时间】:2015-01-31 09:09:44
【问题描述】:

我有一个名为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. 第一次查询和第二次查询有什么区别?

【问题讨论】:

标签: sql sql-server


【解决方案1】:

关于“为什么”的问题部分使用这个:
由于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' 有效)

【讨论】:

  • 同理,我猜最后一个查询的用途是用 OR 扩展它?
  • @VincentvanderWeele 是的,因为false 是逻辑OR 操作的中性元素。但是null=null 由于各种原因并不理想。首先,它是“特别的东西”,可以配置为评估为truefalse。其次,与= 相同的东西评估为false 是不直观的。在OR 操作需要中性元素的情况下,我更喜欢使用1=0 而不是null=null
【解决方案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

【讨论】:

    【解决方案3】:
    • 1=1 总是正确的
    • null=null 总是假的

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

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

    where null=nullor ... 也是如此

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

    【讨论】:

      【解决方案4】:

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

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

      最后一个查询再次只返回与WHERE clause 匹配的行。因为这个条件总是假的,所以它根本不返回一行。

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

      SELECT * 
      FROM Students WHERE NULL IS NULL
      

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

      【讨论】:

        【解决方案5】:

        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 条件 这总是不起作用

        【讨论】:

          【解决方案6】:

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

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

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

          所以你的前 2 个查询是相同的,这就是它给出相同结果的原因。

          select * from Students where null = null 
          

          它显然给出了 0 行,因为两者都 null 在比较方面是不同的,并且条件不是完全填充。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-12
            • 2013-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-08
            相关资源
            最近更新 更多