Как разбить строку на строки? - PullRequest
1 голос
/ 12 марта 2019

У меня следующий запрос. Мне нужно вытащить из таблицы ссылку на каждый номер заказа (уникальный идентификатор). В итоге у меня будет что-то вроде:

Order ID    Ref
A           Xz|Yz

Но я хочу иметь:

Order ID    Ref
A           Xz
A           Yz

Уловка для каждого идентификатора заказа, я мог бы иметь более или менее сцепленные ссылки, но они всегда разделяются '|'.

Мне нужно как-то использовать оператор Select (чтобы прочитать данные в Таблице в предложенном выше формате).

У кого-нибудь есть идеи, как этого добиться?

Ответы [ 3 ]

0 голосов
/ 12 марта 2019

У вас всегда будут трудности с этими данными, потому что их данные не нормированы.

В частности, значения в каждом столбце в настоящее время не являются атомарными;они терпят неудачу в «первой нормальной форме» .

. Вместо этого | -разделенные значения должны быть разбиты на отдельные значения;например, строки в какой-то другой таблице.

0 голосов
/ 12 марта 2019

Эта версия обрабатывает пустые элементы списка и несколько строк:

WITH tbl(order_id, ref) AS (
    SELECT 'A', 'Xz|Yz' FROM DUAL union all
    SELECT 'B', 'B1||B3' FROM DUAL union all
    SELECT 'C', '|C2|C3B3' FROM DUAL
)
SELECT order_id, regexp_substr(ref, '(.*?)(\||$)', 1, level, NULL, 1) ref
FROM tbl
CONNECT BY level <= regexp_count(ref, '\|') + 1
  and prior order_id = order_id
  and prior sys_guid() is not null 
order by order_id;

Пример DB Fiddle

0 голосов
/ 12 марта 2019

В Oracle вы можете использовать рекурсивный запрос с CONNECT BY и REGEXP_SUBSTR:

SELECT order_id, TRIM(REGEXP_SUBSTR(ref, '[^|]+', 1, level)) ref
FROM t
CONNECT BY instr(ref, '|', 1, level - 1) > 0
ORDER BY order_id, ref

Демонстрация на DB Fiddle :

WITH t AS (
    SELECT 'A' order_id, 'Xz|Yz' ref FROM DUAL
)
SELECT order_id, trim(regexp_substr(ref, '[^|]+', 1, level)) ref
FROM t
CONNECT BY instr(ref, '|', 1, level - 1) > 0
order by order_id, ref
ORDER_ID | REF
:------- | :--
A        | Xz 
A        | Yz 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...