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

时间:2013-10-15 06:49:56

标签: sql db2 case 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这样的语句缩短语句的大小?

2 个答案:

答案 0 :(得分:0)

创建一个包含2行包含36行不同值的新表,然后将其加入?这将消除对所有

的案例陈述的需要

答案 1 :(得分: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。然后,我将差值的绝对值以月为单位,然后将其转换为零填充字符字段。