Разделение каждой строки столбца varchar и создание новой строки для каждой разделенной части - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть таблица с именем «Таблица» и атрибут с именем «История».Этот атрибут истории имеет следующие значения:

   1 Finished (30-05-2018);
   2 InProgress (25-05-2018); Rejected(26-05-2018); InProgress (28-05-2018); Finished (30-05-2018);
   3 InProgress (25-05-2018); Finished (30-05-2018);

Я хочу разделить этот атрибут точкой с запятой (;) и создать новую строку для каждой части истории.Таким образом, для строк в приведенном выше коде / примере следует создать 7 строк.Мне удалось сделать это за одну строку с помощью кода ниже.Проблема в том, что я хочу сделать это для каждой строки в этой таблице.Здесь возникает проблема: когда я удаляю условие WHERE в WITH, я получаю путь ко многим результатам и множеству значений NULL.Что я делаю неправильно?

WITH DATA AS
   ( SELECT "WorkID" w,"History" his FROM Table
   where "WorkID" = 75671
   )
   SELECT w, trim(regexp_substr(his, '[^;]+', 1, LEVEL)) his
   FROM DATA
   CONNECT BY regexp_substr(his , '[^;]+', 1, LEVEL) IS NOT NULL

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вот полный рабочий пример, где регулярное выражение ищет разделитель точки с запятой, за которым следует пробел ИЛИ конец строки:

SQL> WITH Tbl(WorkID, History) AS(
     select 1, 'Finished (30-05-2018);' from dual union all
     select 2, 'InProgress (25-05-2018); Rejected(26-05-2018); InProgress (28-05-2018); Finished (30-05-2018);' from dual union all
     select 3, 'InProgress (25-05-2018); Finished (30-05-2018);' from dual
   )
   select WorkID, regexp_substr(History, '(.*?)(; |;$)', 1, level, NULL, 1) history
   from Tbl
   connect by regexp_substr(History, '(.*?)(; |;$)', 1, level) is not null
   and prior WorkID = WorkID
   and prior sys_guid() is not null;

    WORKID HISTORY
---------- -------------------------
         1 Finished (30-05-2018)
         2 InProgress (25-05-2018)
         2 Rejected(26-05-2018)
         2 InProgress (28-05-2018)
         2 Finished (30-05-2018)
         3 InProgress (25-05-2018)
         3 Finished (30-05-2018)

7 rows selected.
0 голосов
/ 27 ноября 2018

Если вы хотите использовать connect by для множества строк, чтобы разбить столбец на несколько строк, вам нужно иметь несколько дополнительных вещей - средство, говорящее Oracle зацикливаться на одной и той же строке, и проверку, чтобы сделатьуверен, что он знает, какую предыдущую строку использовать.

Это означает, что ваш запрос станет примерно таким:

select "WorkID" w,
       "History" his
from table
connect by prior "WorkID" = "WorkID" -- I'm assuming that "WorkID" uniquely identifies a row; if not, add in the additional columns that identify a row
and regexp_substr("History", '[^;]+', 1, level) is not null
and prior sys_guid() is not null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...