SQL DB2 - 可以缩短长期列出的“case when”语句吗?

Posted

技术标签:

【中文标题】SQL DB2 - 可以缩短长期列出的“case when”语句吗?【英文标题】:SQL DB2 - Possible to shorten long-listed 'case when' statement? 【发布时间】:2013-10-15 06:49:55 【问题描述】:

有时我的查询有很长的 case when 语句。例如,

CASE WHEN BASE_YM = TO_CHAR(DEFAULT_YM,            'YYYYMM') THEN '00'
     WHEN BASE_YM = TO_CHAR(DEFAULT_YM - 1 MONTHS, 'YYYYMM') THEN '01'
     WHEN BASE_YM = TO_CHAR(DEFAULT_YM - 2 MONTHS, 'YYYYMM') THEN '02'
     .
     .
     .
     WHEN BASE_YM = TO_CHAR(DEFAULT_YM - 35 MONTHS, 'YYYYMM') THEN '35'
     WHEN BASE_YM = TO_CHAR(DEFAULT_YM - 36 MONTHS, 'YYYYMM') THEN '36'

这种 case when 语句本身占用 37 行,我想知道是否有办法通过使用 i=00, ..., 36 之类的方式来缩短 case when 语句?

【问题讨论】:

BASE_YMDEFAULT_YM的数据类型是什么? 【参考方案1】:

似乎您真正要做的只是找出BASE_YMDEFAULT_YM 之间的月数,并将其设为字符类型。我认为可以通过做一些日期数学来检索相同的结果(我猜它会更有效,因为它不必计算多达 36 个不同的 TO_CHAR 调用)整个语句将替换 @ 987654324@。我在 DB2 for Linux/Unix/Windows v.9.7 和 z/OS v10 上测试了类似的逻辑:

SELECT 
    LPAD(
        ABS(
            MONTH(
                TIMESTAMP_FORMAT(BASE_YM, 'YYYYMM') - 
                DEFAULT_YM
            )
        )
    ,2,'0')
FROM your_table

我添加了额外的间距,以便您可以(希望)更轻松地跟随。基本上,它只是从BASE_YM 的转换形式中减去DEFAULT_YM。然后,我取月差的绝对值,然后将其转换为零填充字符字段。

【讨论】:

我不知道MONTH函数,我搜索了一下,发现db2中有一个MONTHS_BETWEEN函数,并使用了那个。谢谢!【参考方案2】:

创建一个包含 36 行不同值的 2 列的新表,然后加入它?这将完全消除对案例陈述的需要

【讨论】:

以上是关于SQL DB2 - 可以缩短长期列出的“case when”语句吗?的主要内容,如果未能解决你的问题,请参考以下文章

DB2 SQL 比 SUM+CASE 更好的方法来获取基于 ID 的唯一值计数

列出 DB2 Warehouse on Cloud 中的 SQL 语句历史记录

DB2 Case Statement - 如果最大值相同,则选择最小值

DB2 CASE WHEN THEN 向所有值添加两个额外的空值

SQL使用CASE WHEN 行转列为啥会出现NULL值?

case = 1 时的条件计数,DB2