遗留 DB2 SQL 查询连接简化
Legacy DB2 SQL query concatination simplification
我们在 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;
从 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 年以上操作系统的后果。
在 Mark 的回答提到的 TIMESTAMP_FORMAT()
可用之前...
最好的解决方案是创建一个用户定义函数 (UDF) 来为您处理转换。
您可以推出自己的版本,也可以找到开源版本。
Alan Campin 的 iDate 代码是一套完整的用于日期转换的 UDF; downloadable here
我们在 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;
从 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 年以上操作系统的后果。
在 Mark 的回答提到的 TIMESTAMP_FORMAT()
可用之前...
最好的解决方案是创建一个用户定义函数 (UDF) 来为您处理转换。
您可以推出自己的版本,也可以找到开源版本。
Alan Campin 的 iDate 代码是一套完整的用于日期转换的 UDF; downloadable here