【问题标题】:CASE-Statement in WHERE-Clause | SQLWHERE 子句中的 CASE 语句 | SQL
【发布时间】:2020-03-26 21:32:55
【问题描述】:

您好,我有以下表格与当前月份'Month'

+---------------+
| current_Month |
+---------------+
|            12 |
+---------------+

我还有另一张桌子和工人'Workers'

+--------+--------------------------+
|  Name  | Month_joined_the_company |
+--------+--------------------------+
| Peter  |                       12 |
| Paul   |                        9 |
| Sarah  |                        5 |
| Donald |                       12 |
+--------+--------------------------+

我现在想要,根据我的月表,显示直到上个月加入公司的所有工人
当前月份是 10 我想要这个输出

+--------+--------------------------+
|  Name  | Month_joined_the_company |
+--------+--------------------------+
| Paul   |                        9 |
| Sarah  |                        5 |
+--------+--------------------------+

但是在年底,我想包括所有工人,即使哪个月与当月相同

+--------+--------------------------+
|  Name  | Month_joined_the_company |
+--------+--------------------------+
| Peter  |                       12 |
| Paul   |                        9 |
| Sarah  |                        5 |
| Donald |                       12 |
+--------+--------------------------+

我现在有这个声明,但它不起作用......

SELECT * 
FROM workers 
WHERE     
  CASE
        WHEN (SELECT TOP (1) Current_Month FROM Month) = 12
        THEN (Month_joined_the_company <= (SELECT TOP (1) Current_Month FROM Month))
        ELSE (Month_joined_the_company < (SELECT TOP (1) Current_Month FROM Month))
    END

但这不起作用,我得到一个错误。有人可以帮助我,我如何在 WHERE 子句中使用 CASE

【问题讨论】:

  • 称为case 表达式,表示它只能返回一个原子值,不能用于这种方式的程序流
  • 跳过case 表达式。通常最好在WHERE 子句中使用AND/OR 结构。
  • @jarlh 如何使用 AND/OR 来实现我的目标?
  • @HoneyBadger 在某些数据库系统(例如 Postgres)中,表达式完全有可能计算为布尔值,然后将该值用作条件。将WHERE 子句描述为“程序流”也不是很正确,即使在缺少布尔类型因此有特殊条件规则的系统中也是如此。

标签: sql sql-server tsql case-when


【解决方案1】:

这是你想要的吗?

select w.*
from workers w
inner join month m 
    on m.current_month = 12 
    or w.month_joined_the_company < m.current_month

这句话是:如果current_month = 12 然后返回所有工人,否则只返回那些month_joined_the_company 严格小于current_month

注意:您可能应该考虑使用日期数据类型来存储这些值,否则当新的一年开始时会发生什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    相关资源
    最近更新 更多