PL / SQL - разбить строку на ассоциативный массив - PullRequest
0 голосов
/ 27 апреля 2018

В 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 голосов
/ 28 апреля 2018

Этот метод обрабатывает элементы списка NULL, если вам все еще нужно показать, что элемент 2 имеет значение 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. Дополнительная информация

0 голосов
/ 27 апреля 2018

Для такого требования нет встроенной функции.
Но вы можете легко построить запрос, как показано ниже, для разбора этих строк:

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 массовый сбор )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...