有时候我的查询会有很长时间的陈述。例如,
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这样的语句缩短语句的大小?
答案 0 :(得分:0)
创建一个包含2行包含36行不同值的新表,然后将其加入?这将消除对所有
的案例陈述的需要答案 1 :(得分:0)
看起来你真正要做的就是找出BASE_YM
和DEFAULT_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
。然后,我将差值的绝对值以月为单位,然后将其转换为零填充字符字段。