0

有时我的查询有很长的 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'

当语句本身占用 37 行时,我想知道是否有办法通过使用 i=00, ..., 36 来缩短语句的情况?

4

2 回答 2

0

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

于 2013-10-15T07:40:04.660 回答
0

似乎您真正要做的就是找出 和 之间的月份数BASE_YMDEFAULT_YM并将其设为字符类型。我认为可以通过做一些日期数学来检索相同的结果(我猜它会更有效,因为它不必计算多达 36 个不同的TO_CHAR调用)整个语句将替换CASE. 我在 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

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

于 2013-10-15T16:04:26.727 回答