问题描述
我正在为下面的DB2场景寻求最佳解决方案。 我在单个列表中存在数据,并且我想将每一行中的数据都分成单独的列。
我的输入表:
Data
A012356TEST12501
M012385749635201
N012385749635201
B012356TEST12501
A022356TEST12501
M022385749635201
N022385749635201
B022356TEST12501
我想将上表中的数据移动到多个表中。即表格中的数据将被移至4个不同的表格中。对于每个表,我都有列长度到子字符串的详细信息。
Table_A
col1 col2 col3 col4 col5
A 01 2356 TEST 12501
A 02 2356 TEST 12501
Table_M
col1 col2 col3 col4 col5
M 012 3857 49635 201
M 022 2385 74963 201
类似地,表_N和表_B。
解决方法
在这种情况下,您别无选择;如果要在大量数据上运行,则必须使用SUBSTR(),这是一个占用大量CPU的字符串函数:
WITH
-- your input,in a WITH CLAUSE
data_t(data_s) AS (
SELECT 'A012356TEST12501' FROM sysibm.sysdummy1
UNION ALL SELECT 'M012385749635201' FROM sysibm.sysdummy1
UNION ALL SELECT 'N012385749635201' FROM sysibm.sysdummy1
UNION ALL SELECT 'B012356TEST12501' FROM sysibm.sysdummy1
UNION ALL SELECT 'A022356TEST12501' FROM sysibm.sysdummy1
UNION ALL SELECT 'M022385749635201' FROM sysibm.sysdummy1
UNION ALL SELECT 'N022385749635201' FROM sysibm.sysdummy1
UNION ALL SELECT 'B022356TEST12501' FROM sysibm.sysdummy1
)
SELECT
SUBSTR(data_s,1,1) AS col1,SUBSTR(data_s,2,2) AS col2,4,4) AS col3,8,5) AS col4,13,3) AS col5
FROM data_t;
-- out col1 | col2 | col3 | col4 | col5
-- out ------+------+------+-------+------
-- out A | 01 | 2356 | TEST1 | 250
-- out M | 01 | 2385 | 74963 | 520
-- out N | 01 | 2385 | 74963 | 520
-- out B | 01 | 2356 | TEST1 | 250
-- out A | 02 | 2356 | TEST1 | 250
-- out M | 02 | 2385 | 74963 | 520
-- out N | 02 | 2385 | 74963 | 520
-- out B | 02 | 2356 | TEST1 | 250
但是,如果您从ASCII文件中获取该数据,则还可以:
CREATE TABLE splitup (
col1 CHAR(1),col2 SMALLINT,col3 SMALLINT,col4 CHAR(5),col5 SMALLINT
);
LOAD FROM your_in_file OF ASC MODIFIED BY STRIPTBLANKS RECLEN=16
METHOD L (
1 1,2 3,4 7,8 12,13 16
)
INSERT INTO TABLE (
col1,col2,col3,col4,col5
);
,
如果四个表具有相同的列数和相同的数据类型,则可以考虑将INSERT
插入四个(行组织的)表的UNION ALL
VIEW
中每个都限制在COL1上。
但是,可能并非如此(例如,示例中的Col4在表A中看起来像是CHAR,在表B中看起来像是INTEGER或DECIMAL)。
简单的解决方案是只有4条INSERT
语句,每列带有SUBSTR,而每个目标表都有WHERE SUBSTR(Date,1) = 'A'
,= 'N'
等