【问题标题】:IF or CASE in WHERE clause of SQL querySQL 查询的 WHERE 子句中的 IF 或 CASE
【发布时间】:2017-02-28 09:10:57
【问题描述】:

我的问题是我有这样的查询:

SELECT * FROM TABLE1 WHERE STATUSID = @PARAMETER

然后我想将该查询创建为这样的动态查询:

IF @PARAMETER IS 1 THEN STATUSID = 1
IF @PARAMETER IS 2 THEN STATUSID = 2
IF @PARAMETER IS 3 THEN STATUSID = 1 OR STATUSID = 2

谁能给我一个示例查询如何做到这一点?我只想在WHERE 子句中执行此操作,以便可以最小化我的代码行。

【问题讨论】:

  • 请不要大喊大叫。我们不是聋子。

标签: sql sql-server vb.net


【解决方案1】:

使用 OR

SELECT * 
FROM TABLE1 
WHERE (STATUSID = 1 and @PARAMETER = 1)
OR (STATUSID = 2 and @PARAMETER = 2)
or (STATUSID in (1,2) and @PARAMETER = 3)

【讨论】:

    【解决方案2】:
    Use CASE Clause to get result :  
    
    SELECT * FROM TABLE1 WHERE STATUSID = CASE 
      WHEN @PARAMETER = 1 THEN 1 
      WHEN @PARAMETER = 2 THEN 2
      WHEN @PARAMETER = 3 THEN STATUSID END
    

    【讨论】:

    • AND/OR 通常比 where 子句中的 case 表达式更容易优化。
    • 我在 = 1 附近遇到了一些错误,依此类推。 or 声明有效,但无论如何谢谢
    • 您查询的最后一部分不会解决我的问题WHEN @PARAMETER = 3 THEN STATUSID,因为我有一个状态 id 4 等等,我也不想选择
    【解决方案3】:

    另一种解决方案是先检查参数,然后执行相应的查询。

    IF @PARAMETER = 1 THEN SELECT * FROM TABLE1 WHERE STATUSID = 1
    IF @PARAMETER = 2 THEN SELECT * FROM TABLE1 WHERE STATUSID = 2
    IF @PARAMETER = 3 THEN SELECT * FROM TABLE1 WHERE STATUSID = 1 OR STATUSID = 2
    

    对引擎来说是最容易优化的。

    【讨论】:

    • 是的,这是对的,但我只想用 1 行代码来完成。因为在我的查询中它包含很多行所以如果我使用这种技巧我的行代码将变为 x3 因为if
    • 确实,出于这个原因,我也使用了公认的解决方案,但显示更多选项似乎是合适的。在某些情况下,引擎很难优化这种过滤器。
    猜你喜欢
    • 2014-10-13
    • 2014-11-20
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多