【问题标题】:Sql short circuit OR or conditional exists in where clausewhere子句中存在sql短路OR或条件
【发布时间】:2012-11-18 17:17:34
【问题描述】:

我正在尝试强制 sql server 对某些字段进行短路或比较。在 Or 的左侧,我有一个简单的变量比较,而在右侧,我有一个非常“繁重”的子查询。

WHERE
(@Var = 'DefaultValue' )  OR 
Exists(select * from atable)

如果第一个语句为假,有没有办法只执行 or 语句的右侧。

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

我使用的是 MS SQL 服务器

【问题讨论】:

  • 如果这是用于搜索,请阅读 Erland Sommarskog 的 Dynamic Search Conditions in SQL。如果是别的东西,恐怕康拉德是正确的 - 没有保证方法来控制查询中的评估顺序(包括任何 CTE 或子查询)
  • @Damien_The_Unbeliever 感谢您将我指向这篇文章。这应该让我和我的同事们在这个周末读到一些东西:D

标签: sql sql-server performance shortcut


【解决方案1】:

这个怎么样?

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

【讨论】:

    【解决方案2】:

    您无法在单个 SQL 语句中执行您想要的操作。但是,您可以在存储过程中执行类似的操作

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

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

    【讨论】:

    • 我使用了一个版本,它使用 select INTO 并在 If Else 块中添加 where 子句,这样代码更容易阅读。谢谢!
    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多