Case When: Using > Dates and < Dates with multiple conditions

Posted

技术标签:

【中文标题】Case When: Using > Dates and < Dates with multiple conditions【英文标题】:Case When: Using > Dates and < Dates With Multiple Conditions 【发布时间】:2019-10-29 15:28:17 【问题描述】:

我有一个包含三层的 CASE WHEN 语句,每一层都定义了满足 A、B 或 C 特定类别的特定限制标准。A 和 B 严重依赖于 > 或

The criteria are as follows:

When Date is less than 01-OCT-2019 AND Limit is greater than 10,000 Then 'A'

When Date is greater than 01-OCT-2019 AND Limit is less than 90,000 And Plan = CP Then 'B'

When Date is greater than 01-OCT-2019 AND Limit is less than 60,000 And Plan = CO Then 'B'

ELSE 'C'

这已经写成

 CASE 
    WHEN
          TO_CHAR(DATE,'dd-mm-yyyy') < '01-10-2019'
          AND Limit > 10000
          THEN 'A'         
    WHEN 
          TO_CHAR(DATE,'dd-mm-yyyy') > '01-10-2019'
          AND Limit < 90000
          AND Plan = 'CP'
          THEN 'B' 
    WHEN 
          TO_CHAR(DATE,'dd-mm-yyyy') > '01-10-2019'
          AND Limit < 60000
          AND Plan = 'CO'
          THEN 'B'
          ELSE 'C' 
    END AS Category

虽然查询运行,但根据日期条件分类的结果并不准确。例如:

对于 B 类,我应该只检索 2019 年 1 月 10 日 (dd-mm-yyyy) 之后的日期,但我得到的日期可以追溯到 2018 年。

+----+------------+---------+------+----------+---+
| ID |    Date    |  Limit  | Plan | Category |   |  
+----+------------+---------+------+----------+---+
|  1 | 20-11-2018 |  67000  |  CP  |    B     | X |  
|  2 | 08-08-2019 |  32000  |  CO  |    C     | ✓ |  
|  3 | 05-03-2019 |  12000  |  CO  |    A     | ✓ |  
|  4 | 18-10-2019 |  70000  |  CP  |    B     | ✓ |
|  5 | 16-04-2019 |  52000  |  CO  |    B     | X |
|  6 | 23-07-2018 |  17000  |  CP  |    A     | ✓ |     
+----+------------+---------+------+----------+---+

数据库显示日期结构为“01-OCT-2019”,但是,我希望输出显示为“01-10-2019”。在这种情况下,我包含了 To_Char 函数。

对于解决这个日期问题有什么建议吗?

【问题讨论】:

你试过用 to_date(DATE,'dd-mm-yyyy') > to_date( '01-10-2019', 'dd-mm-yyyy') 【参考方案1】:

您需要简单地检查日期,而不是将它们转换为字符串,因为日期顺序与应用于表示日期的字符串的字典顺序不同。

您的代码可能是:

CASE 
    WHEN
          DATE < date '2019-10-01'
          AND Limit > 10000
          THEN 'A'         
    WHEN 
          DATE > date '2019-10-01'
          AND Limit < 90000
          AND Plan = 'CP'
          THEN 'B' 
    WHEN 
          DATE > date '2019-10-01'
          AND Limit < 60000
          AND Plan = 'CO'
          THEN 'B'
          ELSE 'C' 
    END AS Category

请注意,我保留了您的 DATE 专栏,即使它是一个保留字; date '2019-10-01' 部分是在 Oracle 中表示日期的 ANSI 方式。

在选择列表中,您可以使用to_char 获取格式化输出所需的方式。

【讨论】:

以上是关于Case When: Using > Dates and < Dates with multiple conditions的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver case when问题

case when

记录一个mysql的case when用法

SQL语句case when

CASE WHEN用法

select case when if 的一些用法