Oracle SQL: взять строку и превратить в логическую таблицу? - PullRequest
0 голосов
/ 31 октября 2019

Я ищу несколько советов при работе со значением столбца, которое представляет собой строку (varchar (4000)), содержащую комментарии. Я должен выполнить извлечение на основе дат, однако у меня нет временных меток, кроме метки времени в строке. Мне нужно извлечь все комментарии, которые были созданы за последние 6 месяцев. Я играл с regexp_SUBSTR, regexp_INSTR, но из-за ограничений на 10g я не могу использовать regexp_count, что усложняет жизнь.

Строка будет выглядеть так:

LOCKED ENTITY: ACCOUNT
LOCKED BY USER: ops
LOCKED AT: 31/05/2004 11:47
CUST NOTES: <Please enter explanation here>
Customer notes are entered here.

UNLOCKED ENTITY: ACCOUNT
UNLOCKED BY USER: ops
UNLOCKED AT: 31/05/2004 11:49
UNLOCK NOTES: <Please enter explanation here>
Test

LOCKED ENTITY: USER
LOCKED BY USER: ops
LOCKED AT: 31/05/2004 11:50
LOCK NOTES: <Please enter explanation here>
Test

UNLOCKED ENTITY: USER
UNLOCKED BY USER: ops
UNLOCKED AT: 24/08/2009 16:47
UNLOCKED NOTES: <Please enter explanation here>

К счастью, Куски данных помечены, однако мне нужно извлечь все вышеперечисленные «блоки» по отдельности, поэтому, по сути, есть ID и 4 записи. Идентификатор - другой столбец этой таблицы.

Проблема, с которой я столкнулся, заключается в том, что, хотя в приведенном выше примере показаны 4 блока, некоторые из которых могут иметь больше или меньше, но нет определенного числа, с которым можно работать. Я пытался использовать CONNECT BY и REGECP_COUNT для запуска всех вхождений, но я не получил результатов, и regexp_count - это 11g и больше.

В идеале я хотел бы получить что-то похожее на это;

ID       ENTITY                          ACTION                     DATE                          LOCK_NOTES
-------  ------------------------------- -------------------------- ----------------------------- ---------------------------------------------------------------------
11652907 LOCKED ENTITY: ACCOUNT          LOCKED BY USER: OPS        LOCKED AT: 11/06/2004 09:11   LOCK NOTES: ACCT Locked
11652907 LOCKED ENTITY: USER             LOCKED BY USER: OPS        LOCKED AT: 11/06/2004 09:58   LOCK NOTES: User Locked
11652907 UNLOCKED ENTITY: USER           UNLOCKED BY USER: OPS      UNLOCKED AT: 11/06/2004 20:05 UNLOCK NOTES: User now aware.

Который я тогда смогу запросить на основе даты и извлечь соответствующие записи.

Любая помощь будет принята с благодарностью.

Спасибо.

1 Ответ

1 голос
/ 31 октября 2019

Вы можете использовать regexp_substr(str,'^.*+$',1,level,'m'), чтобы извлечь каждую строку вместе с level pseoducolumn в структуре select..connect by level, чтобы определить номера строк, и сгруппировать по шести строкам:

with tab as
(
select regexp_substr(str,'^.*+$',1,level,'m') as str, level as rn
  from tab0
connect by level <= instr(str,chr(10))+1
)
select max(case when mod(rn,6)=1 then str end) as "ENTITY",
       max(case when mod(rn,6)=2 then str end) as "ACTION",
       max(case when mod(rn,6)=3 then str end) as "DATE",
       max(case when mod(rn,6)=4 then str end) as "LOCK_NOTES"
  from tab
 group by ceil(rn/6);

, где Chr(10) - этосимвол перевода строки

Демо

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