Разделить столбец, разделенный запятыми, на строки - для нескольких строк

Мне нужно разделить объявленную строку, разделенную ; в ряды, как показано ниже. Это хорошо работает, если я объявляю строку и разделяю ее. Вместо объявления я должен выбрать эту строку из таблицы и многократно ее анализировать. Каждая строка может содержать разное количество строк.

Что было бы лучшим подходом?? Должен ли я перебирать каждую строку, анализировать их или есть лучший способ сделать это?

--Обязательный вывод

status := off
status:= on

--ЗАПРОС

declare
myString varchar2(2000):='status := off; status:= on;';
begin
     for r in
      ( select regexp_substr(myString,'[^;]+',1,level) element
          from dual
       connect by level <= length(regexp_replace(myString,'[^;]+')) + 1
      )
      loop
       dbms_output.put_line(r.element);
     end loop;
   end;

person texasnewbie    schedule 31.12.2019    source источник
comment
Похоже, это может быть вопрос об Oracle? Вы можете отредактировать свой вопрос и добавить sql и oracle к своему вопросу, чтобы задать вопрос нужной аудитории.   -  person Heretic Monkey    schedule 31.12.2019
comment
@BobJarvis-ReinstateMonica Это обман, есть много вопросов о разделении строк с разделителями в Oracle; если вы хотите найти лучший дубликат, пожалуйста, добавьте/отредактируйте список дубликатов. Я уже добавил второй дубликат при отделении от таблицы и ищу еще. У вас есть репутация делать то же самое. Кроме того, OP не исключает переменную в PL/SQL, они запрашивают мнения о том, как лучше всего это сделать .... поэтому, даже если это не дубликат (это так), его следует закрыть как основное мнение -основанный на.   -  person MT0    schedule 31.12.2019


Ответы (1)


На самом деле особой разницы нет - вы выбираете из своей таблицы вместо DUAL, используя соответствующий столбец вместо myString:

SELECT TRIM(REGEXP_SUBSTR(A_STRING,'[^;]+',1,LEVEL)) ELEMENT
  FROM SOME_TABLE
  CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(A_STRING,'[^;]+')) + 1

Я добавил туда TRIM, потому что перед второй строкой был лишний пробел. Оставить или удалить по нашему выбору.

db‹>скрипка здесь

person Bob Jarvis - Reinstate Monica    schedule 31.12.2019
comment
Спасибо. Когда я пытаюсь сделать выбор, как указано, он никогда не извлекает строки. Я изменил соединение по уровню › 0, и он выдал сообщение «Недостаточно памяти для подключения по операции». - person texasnewbie; 01.01.2020
comment
LEVEL всегда › 0, поэтому CONNECT BY LEVEL > 0 — это, по сути, бесконечный цикл. Хорошо, упрощайте. Что произойдет, если вы сделаете SELECT whatever FROM YOUR_TABLE? Если это дает данные, начните добавлять элементы, пока все не сломается. Потом понять, почему он сломался. - person Bob Jarvis - Reinstate Monica; 01.01.2020