在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并使它看起来很乱)。我正在寻找能让我的工作更简单的事情。
答案 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