在SQL过程中将一列中的逗号分隔值拆分为多列
Posted
技术标签:
【中文标题】在SQL过程中将一列中的逗号分隔值拆分为多列【英文标题】:Splitting comma separated value in a column into multiple columns in SQL Procedure 【发布时间】:2020-10-13 06:03:29 【问题描述】:我运行一个程序如下。
PROCEDURE LOAD_SPM_ITEM_SYNC(P_ENCODED_STRING IN CLOB,truncateflag in varchar2) IS
output varchar2(30000);
BEGIN
if (truncateflag='true') then
execute immediate 'truncate table SPM_ITEM_SYNC';
end if;
output:=utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw(P_ENCODED_STRING)));
dbms_output.put_line(output);
insert into demo(column_1)
select regexp_substr(output, '[^'||CHR(10)||CHR(13)||']+', 1, level)
from dual
connect by regexp_substr(output, '[^'||CHR(10)||CHR(13)||']+', 1, level) is not null;
end LOAD_SPM_ITEM_SYNC;
上述过程将 CSV 的编码字符串作为输入,并将其插入到表中。
示例编码字符串为 MSwyLDMKMSwyLDMKMSwyLDM=
运行程序后的输出:
column_1 column_2 column_3
1,2,3
1,2,3
1,2,3
但我的要求是
column_1 column_2 column_3
1 2 3
1 2 3
1 2 3
我尝试使用 SPLIT_PART 拆分 column_1,但它不起作用。我尝试使用 string_split 但仍然失败并给出错误。我应该在哪里修改代码以将值插入不同的列?
提前致谢。
【问题讨论】:
【参考方案1】:这个:
insert into demo(column_1)
将值插入单个列,而不是 3
不同的列。这意味着您必须拆分字符串。如何?例如,使用 SUBSTR
+ INSTR
(第 4 - 10 行)或正则表达式(第 13 - 15 行)。
SQL> with test (col) as
2 (select '1,2,3' from dual)
3 select -- SUBSTR + INSTR
4 substr(col, 1, instr(col, ',', 1, 1) - 1) col1,
5 --
6 substr(col, instr(col, ',', 1, 1) + 1,
7 instr(col, ',', 1, 2) - instr(col, ',', 1, 1) - 1
8 ) col2,
9 --
10 substr(col, instr(col, ',', 1, 2) + 1) col3,
11 --
12 -- REGEXP
13 regexp_substr(col, '\d+', 1, 1) col1r,
14 regexp_substr(col, '\d+', 1, 2) col2r,
15 regexp_substr(col, '\d+', 1, 3) col3r
16 from test;
C C C C C C
- - - - - -
1 2 3 1 2 3
SQL>
然后将它们中的每一个插入到自己的列中,所以:
insert into demo (column_1, column_2, column_3) values (col1, col2, col3)
顺便说一句,我不知道“split_part
”和“string_split
”是什么。
【讨论】:
嗨@Littlefoot,我看到你已经将字符串'1,2,3'作为输入,但它可以是通用的吗?因为我可能会以编码格式获得 1000 行数据。如果您不介意,您可以编辑我现有的代码以插入多列吗?以上是关于在SQL过程中将一列中的逗号分隔值拆分为多列的主要内容,如果未能解决你的问题,请参考以下文章