我一直在寻找一种很好的方法来进行SQL查询,在这里我可以有一个where语句,如果留空,会表现得像它根本不存在。我发现了这个,看起来效果很好:
WHERE (Column = @value OR @value is null)
如果我为@value指定了一个值,搜索就会按照我想要的方式进行过滤。但是如果我传入null,就像说@value可以是任何东西。我喜欢这个。这很好。我不明白的是,为什么这样的工作呢?
答案 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 |
+---------+------+---------+---------+
所以:
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语句时,您的应用程序中不需要条件逻辑(如果存在多个“切换”,则可能会变得非常毛茸茸)。