【问题标题】:SQL Server WHERE based on CASE [duplicate]SQL Server WHERE 基于 CASE [重复]
【发布时间】:2019-02-15 21:47:04
【问题描述】:

如果 PARAM 等于 1,则要搜索 TAX = 'asd' 的所有行,否则搜索 TAX 'asd' 的所有行(不是 'asd' 的每一行)。

类似这样的:

WHERE
  TAX (
     CASE
        WHEN PARAM = '1'
           THEN = 'asd'
        ELSE <> 'asd'
     END)

【问题讨论】:

  • where 子句中使用case 表达式通常是个坏主意。请改用AND/OR 结构。

标签: sql sql-server


【解决方案1】:

不需要CASE 语句,只需使用方括号和OR

SELECT *
FROM yourtable
WHERE (TAX = 'asd' AND PARAM = '1') OR (TAX != 'asd')

【讨论】:

  • 注意:它会选择(TAX, PARAM) = ('fds', '1')
  • @SalmanA 他们没有说明他们不想要!= asd & =1
  • CASE 声明(修复后)将产生与您发布的内容不同的结果。 OP 很清楚,如果 param 为 1,他们想要 asd 否则除了 asd 之外的任何东西。
【解决方案2】:

您可以使用布尔逻辑添加where 子句:

WHERE (PARAM = 1 AND TAX = 'asd') OR
      (PARAM <> 1 AND TAX <> 'asd');

如果PARAM 具有NUMERIC 类型,则无需包含' '

【讨论】:

    【解决方案3】:
    SELECT *
    FROm table
    WHERE (TAX = 'asd' AND PARAM IN (1))
    OR (TAX <> 'asd' AND PARAM NOT IN (1))
    

    【讨论】:

      【解决方案4】:

      这可以通过 OR、AND 和一些括号来实现:

      WHERE (PARAM = 1 AND TAX = 'asd')
      OR (TAX <> 'asd')
      

      请务必考虑 TAX 可能为 NULL 的情况,除非您的数据库设计明确禁止这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-18
        • 2021-08-09
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多