为什么这个SQL语句以它的方式工作?

时间:2013-01-13 03:50:00

标签: sql sql-server tsql

我一直在寻找一种很好的方法来进行SQL查询,在这里我可以有一个where语句,如果留空,会表现得像它根本不存在。我发现了这个,看起来效果很好:

WHERE (Column = @value OR @value is null)

如果我为@value指定了一个值,搜索就会按照我想要的方式进行过滤。但是如果我传入null,就像说@value可以是任何东西。我喜欢这个。这很好。我不明白的是,为什么这样的工作呢?

2 个答案:

答案 0 :(得分:3)

如果@value为null,则为WHERE子句:

WHERE (Column = @value OR @value is null)

缩减为

WHERE (Column = @value OR 1=1)

(这与其他常见语言中的if (Column == value || true)类似)

如果其任一操作数(边)为真,则OR连接为真:SQL uses three valued logic

+---------+------+---------+---------+
| A OR B  | TRUE | Unknown |  FALSE  |
+---------+------+---------+---------+
| TRUE    | TRUE | TRUE    | TRUE    |
| Unknown | TRUE | Unknown | Unknown |
| FALSE   | TRUE | Unknown | FALSE   |
+---------+------+---------+---------+

所以:

  • 如果@value为null,则WHERE子句的右侧为true,因此整个条件为true,并且始终满足WHERE子句。
  • 如果@value 不是 null,那么WHERE子句的右侧是false,那么WHERE子句是否满足取决于Column = @value

答案 1 :(得分:1)

嗯,有两种情况:

1)@value是“某事”。

在这种情况下,第二个子句总是false,因为“something”永远不会为null。所有有效的保留是WHERE Column = @value

2)@value为空

在这种情况下,第二个子句总是false,因为null永远不等于任何东西。因此,有效保留的是WHERE @value is null,并且已知@value为null,因此这类似于WHERE 1 = 1,并忽略整个WHERE。数据库应该足够聪明,可以在触摸任何数据之前弄清楚这一点,所以这应该就像没有指定任何条件一样。

所以你在这里有一个单独的SQL语句可以像两个一样,带有“可选的WHERE”。对于这两种情况,优于两个单独的SQL语句的优点是,在构建SQL语句时,您的应用程序中不需要条件逻辑(如果存在多个“切换”,则可能会变得非常毛茸茸)。