在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过程中将一列中的逗号分隔值拆分为多列的主要内容,如果未能解决你的问题,请参考以下文章

mysql中将一列以逗号分隔的值分割成多列显示?

sql 分隔符

在 PowerShell 中将字符串拆分为多列

SQL Server 逗号分隔列到多列

如何根据oracle plsql中列中的逗号分隔值拆分选择查询行

基于SQL Server中的分隔符将文本拆分为多列