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_YM
和DEFAULT_YM
的数据类型是什么?
【参考方案1】:
似乎您真正要做的只是找出BASE_YM
和DEFAULT_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 - 如果最大值相同,则选择最小值