2012-05-11 80 views
5

目前,我有一个存储过程,它需要一个字符串速记IF语句在SQL

@vari as varchar(30) 
if @vari is null 
    SELECT * FROM TABLE 
else 
    SELECT * FROM TABLE WHERE col = @vari 
endif 

有什么办法内联的if语句,因此不会宣布2选择只是因为1个PARAM的?

+0

你也可以用case语句做到这一点,它不是短以下,但在某些情况下,它是更好的答案。 – Purplegoldfish

+0

我不会改变你的代码,因为在大多数情况下,sql会比'或'条件产生更好的执行计划。 –

回答

15
SELECT * FROM TABLE WHERE (@vari is null or col = @vari) 
+0

这可行,但我的下一个问题:为什么?括号中是否只将第一个标准评估为真,然后停止或...? – Alex

+3

@Alex:它仍然评估这两个标准,但是由于'或',任何一个对于包含在结果集中的行都可以是真实的。如果'@vari为null',那么每一行都会被返回,因为第一部分总是为真。否则,返回的唯一行将是与第二部分“col = @ vari”匹配的那些行,它将应用过滤器。 – mellamokb

+2

括号在这里,因为我有习惯把OR放在括号里。 –

3

假设col是从来没有空,你可以这样做:

select * 
from table 
where col = isnull(@vari, col)