首页 > 解决方案 > 遗留 DB2 SQL 查询连接简化

问题描述

我们在 AS/400 系统上安装了一个 DB2 数据库。(是的,它已被 IBM 以几种方式重新命名)

当我对字符串片段进行连接时,您可以看到冗余。

我已经看到了一些解决方案,但请记住,由于我们的数据库是 DB2 的一个相当旧的非标准版本,因此许多解决方案似乎都不起作用。有没有办法减少 CHAR(19000000 + a10) 计算的冗余?它可以工作,但它的转换次数比它需要的多得多。

SELECT DISTINCT pdk01.a00 AS POLICY, 
                    pdk01.b27_mins_name AS "INS NAME", 
                    substr(CHAR(19000000 + a10), 1, 4) || '/' || substr(CHAR(19000000 + a10), 5, 2) || '/' || substr(CHAR(19000000 + a10), 7, 2) as "Orig Eff Date",                    
                    substr(CHAR(19000000 + a09), 1, 4) || '/' || substr(CHAR(19000000 + a09), 5, 2) || '/' || substr(CHAR(19000000 + a09), 7, 2) AS "Expire Date", 
                    pdk01.a21_mtotal_prem AS PREMIUM 
    FROM   mudata.pdk01 AS PDK01 
           INNER JOIN mudata.pdk04 AS PDK04 
                   ON pdk01.a00_m1_pol_num = pdk04.a00_m4_pol_num 
    WHERE  pdk01.a11_mnext_act_code <> 'P' 
           AND pdk04.b83 = '91342' 
    ORDER  BY pdk01.a00 asc;

标签: sqldb2ibm-midrange

解决方案


从 v6.1 开始,您可以使用 TIMESTAMP_FORMAT 函数将字符串转换为时间戳,然后再转换为您选择的任何格式。以下是如何将包含 180205 (YYMMDD) 的字符串转换为时间戳。

TIMESTAMP_FORMAT(field, 'YYMMDD')

要将其更改为仅日期字段,您可以这样做:

DATE(TIMESTAMP_FORMAT(field, 'YYMMDD'))

要将其更改为带有分隔符的字符字段,请执行以下操作:

CHAR(DATE(TIMESTAMP_FORMAT(field, 'YYMMDD')), ISO)

当然 ISO 使用 - 而不是 / 作为分隔符,因此您需要将其替换为:

REPLACE(CHAR(DATE(TIMESTAMP_FORMAT(field, 'YYMMDD')), ISO), '-', '/')

如果您的版本早于 v6.1,那么您将只需要处理拥有 12 年以上旧操作系统的后果。


推荐阅读