where子句中存在Sql短路或条件

where子句中存在Sql短路或条件,sql,sql-server,performance,shortcut,Sql,Sql Server,Performance,Shortcut,我试图强制SQLServer对某些字段进行短路或比较。在Or的左侧,我有一个简单的变量比较,在右侧,我有一个相当“沉重”的子查询 WHERE (@Var = 'DefaultValue' ) OR Exists(select * from atable) 如果第一条语句为false,是否有办法只执行or语句的右侧 我试过case和if-else语句,但找不到任何有效语法 我使用的是MS SQL server您无法在一条SQL语句中执行所需的操作。但是,您可以在存储过程中执行类似的操作 If

我试图强制SQLServer对某些字段进行短路或比较。在Or的左侧,我有一个简单的变量比较,在右侧,我有一个相当“沉重”的子查询

WHERE
(@Var = 'DefaultValue' )  OR 
Exists(select * from atable)
如果第一条语句为false,是否有办法只执行or语句的右侧

我试过case和if-else语句,但找不到任何有效语法


我使用的是MS SQL server

您无法在一条SQL语句中执行所需的操作。但是,您可以在存储过程中执行类似的操作

If @Var = 'DefaultValue' then
BEGIN
     SELECT * FROM table 
END
ELSE
BEGIN
     SELECT * FROM table
     WHERE Exists(select * from atable)
END

如果你有很多的输入,你应该考虑动态SQL

< P>你不能在一个SQL语句中做你想做的事情。但是,您可以在存储过程中执行类似的操作

If @Var = 'DefaultValue' then
BEGIN
     SELECT * FROM table 
END
ELSE
BEGIN
     SELECT * FROM table
     WHERE Exists(select * from atable)
END

如果你有很多的输入,你应该考虑动态SQL

这如何?

WHERE 1 = CASE @Var
               WHEN 'DefaultValue' THEN 1
               ELSE (SELECT TOP 1 1 FROM atable)
          END
这个怎么样

WHERE 1 = CASE @Var
               WHEN 'DefaultValue' THEN 1
               ELSE (SELECT TOP 1 1 FROM atable)
          END

如果这是为了搜索,请阅读Erland Sommarskog。如果是其他原因,恐怕Conrad是对的-没有任何方法可以保证控制查询(包括任何CTE或子查询)中的求值顺序@Damien_The_unsiver感谢您为我指出这篇文章。这应该会给我和我的同事们带来一些阅读的东西:如果这是为了搜索,请阅读Erland Sommarskog。如果是其他原因,恐怕Conrad是对的-没有任何方法可以保证控制查询(包括任何CTE或子查询)中的求值顺序@Damien_The_unsiver感谢您为我指出这篇文章。这应该给我和我的同事们本周末带来一些阅读的内容:我使用了一个版本,使用了select-INTO,并在If-Else块中添加了where子句,因此代码更易于阅读。谢谢我使用了一个版本,使用select-INTO并在If-Else块中添加where子句,因此代码更易于阅读。谢谢