PL / SQL - 将字符串拆分为关联数组

时间:2018-04-27 00:51:31

标签: oracle plsql

在plsql中有没有办法将字符串拆分成关联数组?

示例字符串:'test1:First string, test2: Second string, test3: Third string'

INTO

TYPE as_array IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(50);
a_array as_array;

dbms_output.put_line(a_array('test1')); // Output 'First string' 
dbms_output.put_line(a_array('test2')); // Output 'Second string'
dbms_output.put_line(a_array('test3')); // Output 'Third string'

字符串的格式对我的目的无关紧要。它可能是'test1-First string; test2-Second string; test3-Third string'。我可以用一个非常大的函数来做这个,首先用逗号分割然后分割每个,但我想知道该语言是否内置了什么。

就像我说的那样,我不希望通过一个大函数来做(特别是使用substr并使它看起来很乱)。我正在寻找能让我的工作更简单的事情。

2 个答案:

答案 0 :(得分:4)

这种要求没有内置功能 但您可以轻松地构建如下所示的查询来解析这些字符串:

SELECT y.* 
FROM (
    select trim(regexp_substr(str,'[^,]+', 1, level)) as str1
    from ( 
       SELECT 'test1:First string, test2: Second string, test3: Third string' as Str 
       FROM dual 
    )
    connect by regexp_substr(str, '[^,]+', 1, level) is not null
) x
CROSS APPLY(
    select trim(regexp_substr(str1,'[^:]+', 1, 1)) as key,
           trim(regexp_substr(str1,'[^:]+', 1, 2)) as value
    from dual
) y
KEY    VALUE         
------ --------------
test1  First string  
test2  Second string 
test3  Third string  

然后您可以在函数中使用此查询并将其结果传递给数组 我为你留下了这个练习,我相信你可以管理它(提示:使用Oracle bulk collect功能)

答案 1 :(得分:1)

如果您仍需要显示元素2为NULL,则此方法处理NULL列表元素。注意第二个元素是NULL:

-- Original data with multiple delimiters and a NULL element for testing.
with orig_data(str) as (
  select 'test1:First string,, test3: Third string' from dual 
),
--Split on first delimiter (comma)
Parsed_data(rec) as (
  select regexp_substr(str, '(.*?)(,|$)', 1, LEVEL, NULL, 1)
  from orig_data
  where str is not null
  CONNECT BY LEVEL <= REGEXP_COUNT(str, ',') + 1 
)
-- For testing-shows records based on 1st level delimiter
--select rec from parsed_data;

-- Split the record into columns
select trim(regexp_replace(rec, '^(.*):.*', '\1')) key,
       trim(regexp_replace(rec, '^.*:(.*)', '\1')) value
from Parsed_data;

注意[^,]+的正则表单形式用于解析分隔字符串,它在NULL元素上失败。 More Information