Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql中的简写IF语句_Sql_Sql Server - Fatal编程技术网

sql中的简写IF语句

sql中的简写IF语句,sql,sql-server,Sql,Sql Server,目前我有一个存储的proc,它接受一个字符串 @vari as varchar(30) if @vari is null SELECT * FROM TABLE else SELECT * FROM TABLE WHERE col = @vari endif 有没有办法内联if语句,从而不因为1个参数而声明2个select?假设col从不为NULL,您可以这样做: SELECT * FROM TABLE WHERE (@vari is null or col = @var

目前我有一个存储的proc,它接受一个字符串

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

有没有办法内联if语句,从而不因为1个参数而声明2个select?

假设
col
从不为NULL,您可以这样做:

SELECT * FROM TABLE WHERE (@vari is null or col = @vari)
select *
from table
where col = isnull(@vari, col)

这是可行的,但我的下一个问题是:为什么?括号是否仅将第一个条件计算为true然后停止或…?@Alex:它仍将计算这两个条件,但由于
,对于要包含在结果集中的行,其中任何一个都可能为true。如果
@vari为空
,则将返回每一行,因为第一部分始终为真。否则,返回的行将是与第二部分匹配的行,
col=@vari
,该部分应用过滤器。括号在这里是因为我习惯将OR放在括号中。@mellamokb感谢您的解释,我想找一篇关于Sql Server中表达式短路的好文章,但你帮了我的忙;-)不要依赖于短路。。。这些子句可以按照SQL Server认为合适的任何顺序进行计算。您也可以使用case语句进行计算,它没有下面的答案那么短,但在某些情况下会更好。我不会更改您的代码,因为在大多数情况下,SQL生成的执行计划比组合的
条件要好得多。