【问题标题】:SQL Case statement specifiying condition in where clause?SQL Case语句在where子句中指定条件?
【发布时间】:2011-08-21 19:20:55
【问题描述】:

我有以下查询:

    SELECT * 
FROM dbo.tblOrders o
WHERE o.OrderId IN (SELECT [Value] FROM [dbo].[udf_GenerateVarcharTableFromStringList](@OrderId, ','))
AND
@ActiveInactive =
CASE 
WHEN 'Active' THEN (o.[orderactivedate] > o.[orderinactivedate])
WHEN 'Inactive' THEN (o.[orderactivedate] < o.[orderinactivedate]) 
END

这会返回

An expression of non-boolean type specified in a context where a condition is expected, near 'THEN'.

我怎样才能让它发挥作用?说如果参数是 'Active' 则返回符合以下条件的记录?

【问题讨论】:

  • 顺便说一句...您需要关闭“Active” Then 语句上的括号。
  • 添加了右括号

标签: sql sql-server tsql case


【解决方案1】:

你可以换一种方式:

SELECT * 
FROM dbo.tblOrders o
WHERE o.OrderId IN (SELECT [Value] FROM [dbo].[udf_GenerateVarcharTableFromStringList](@OrderId, ','))
AND ((@ActiveInactive = 'Active' AND o.[orderactivedate] > o.[orderinactivedate])
OR   (@ActiveInactive = 'Inactive' AND o.[orderactivedate] < o.[orderinactivedate]))

【讨论】:

    【解决方案2】:
    SELECT * 
    FROM dbo.tblOrders o
    WHERE o.OrderId IN (SELECT [Value] FROM [dbo].[udf_GenerateVarcharTableFromStringList](@OrderId, ','))
    AND
    @ActiveInactive =
    CASE 
    WHEN (o.[orderactivedate] > o.[orderinactivedate]) then 'Active'
    WHEN (o.[orderactivedate] < o.[orderinactivedate]) THEN 'Inactive'
    END
    

    【讨论】:

    • 请使用大括号按钮格式化代码{}。否则,好的想法
    【解决方案3】:

    为什么不添加 OR 条件?喜欢

    SELECT... WHERE ...
    AND ((@ActiveInactive = 'Active' AND o.[orderactivedate] > o.[orderinactivedate])  OR
        (@ActiveInactive = 'Inactive' AND o.[orderactivedate] < o.[orderinactivedate]))
    

    【讨论】:

      【解决方案4】:

      您不能在这样的 CASE 中使用比较表达式

      我会考虑这个选项,它将比较更改为普通表达式

      ...
      AND
      CASE @ActiveInactive 
      WHEN 'Active' THEN DATEDIFF(day, o.[orderinactivedate], o.[orderactivedate])
      WHEN 'Inactive' THEN DATEDIFF(day, o.[orderactivedate], o.[orderinactivedate])
      END > 0
      

      或者这个,你可以在 SIGN() 表达式上有一个计算列

      SIGN(DATEDIFF(day, o.[orderinactivedate], o.[orderactivedate])) =
                    CASE WHEN @ActiveInactive WHEN 'Active' THEN 1 WHEN 'InActive' THEN -1 END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多