【问题标题】:How to use case in a where clause - SQL Server如何在 where 子句中使用案例 - SQL Server [关闭]
【发布时间】:2022-01-21 15:31:37
【问题描述】:

我的查询如下所示:

SELECT col1,col2
FROM dbo.table1

现在我被要求使用 case 子句过滤掉:

if col1 > 5 then display only col2 > 10
and if col1 <= 5 then display only col2 > 20

有没有办法做到这一点?

【问题讨论】:

  • 是的,只要你解释你想要什么then display only col2&gt;10 是什么意思?仅当 col2 大于 10 时才显示行?你不需要CASE
  • 您可以简单地将您的要求放在where 子句中 - 比如WHERE (col1&gt;5 AND col2&gt;10) OR (col1&lt;=5 AND col2&gt;20
  • 您的问题需要表述得更清楚,您通常不会使用 case 表达式 来过滤行,then display only col2&gt;10 是什么意思?
  • display only col2 &gt; 10 这是什么意思?显示为真?仅当 COL2 > 10 时才显示一列或另一列? T-SQL 没有布尔类型,因此您不能将布尔表达式用作值。如果你想返回可以翻译成 TRUE/FALSE 的东西,你需要明确地返回 1 或 0。
  • This answer 解释了如何在 join 条件中使用 case 表达式。它也适用于where 子句。预计表现会从沉闷到糟糕。

标签: sql sql-server tsql


【解决方案1】:

如果您只想显示 col2 大于 10 或 20 的行,则不需要 CASE。你可以使用OR

select col1, col2
from table1
where (col1>5 and col2>10) OR (col1<=5 and col2>20)

另一方面,如果您想显示 COL2 是高于还是低于另一个数字,则需要在 SELECT 子句中使用 CASE,而不是 WHERE。

SELECT col1, col2, 
    CASE WHEN COL1 > 5 THEN IIF(COL2>10,1,0)
         WHEN COL1 <=5 THEN IIF(COL2>20,1,0)
    END
FROM table1

T-SQL 没有布尔类型,因此布尔表达式不能用作值。如果你想返回一些可以被客户端应用程序转换为 TRUE 或 FALSE 的东西,你需要明确地返回它。

IIFCASE WHEN condition THEN a ELSE b END 的快捷方式。

【讨论】:

  • 这个不回答问题,意思是,如果col1>5则显示col2>10,col2>10不是条件
  • @Aby_g 又是什么意思?您要显示TRUE 还是FALSE?您不能只在 SQL 中显示 col2&gt;10 - 尤其是在没有布尔值的 T-SQL 中
  • @Aby_g 我添加了一个不同的查询,可以回答您的问题。你真的需要解释你想要什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2018-07-14
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
相关资源
最近更新 更多