Разделить строку с помощью разделителей и поместить их в несколько строк в sql, не работающем

Я пытаюсь запустить sql-запрос, где в моей таблице ** сообщений ** у меня есть несколько столбцов, в которых значения разделены двоеточием или запятой. Поэтому, если у него есть значения mul, я пытаюсь сделать его отдельной строкой. Итак, поскольку моя конфигурация не поддерживает использование string_split, поэтому я использую regexp_substr() для разделения строки с использованием разделителей и отображения в нескольких строках.

**messages table**

username      id_criteria         code_criteria
Kim            22:                 21-23:21-22
Tim            36:                  All
Sam            21,22,23:24:25:      (null)

Это то, что я пробовал

**SQL-запрос**

select  user_name, trim(regexp_substr(id_criteria,'[^:|^,]+', 1, level) ) as idrefval

from messages

connect by regexp_substr(id_criteria, '[^:|^,]+', 1, level) is not null

Я получаю это в нескольких строках, но не получаю желаемого, то есть либо пропускаю некоторые id_criterias, либо некоторые строки отсутствуют

я становлюсь таким

username      id_criteria         code_criteria
Sam            23                (null)
Sam            24                (null)
Sam            25                (null)

но ожидаемое должно быть

 username      id_criteria         code_criteria
   Kim            22                 21-23:21-22
   Tim            36                  All
   Sam            21                 (null)
   Sam            22                 (null)
   Sam            23                 (null)
   Sam            24                 (null)
   Sam            25                 (null)

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

что это за DBM и какая версия?

SelVazi 14.02.2023 08:41
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
SELECT user_name, 
       trim(regexp_substr(id_criteria, '[^:|^,]+', 1, level)) AS idrefval,
       trim(regexp_substr(code_criteria, '[^:|^,]+', 1, level)) AS coderefval
FROM messages
CONNECT BY regexp_substr(id_criteria, '[^:|^,]+', 1, level) IS NOT NULL
   AND PRIOR user_name = user_name
   AND PRIOR id_criteria = id_criteria
   AND regexp_substr(code_criteria, '[^:|^,]+', 1, level) IS NOT NULL
   AND PRIOR user_name = user_name
   AND PRIOR id_criteria = id_criteria
   AND PRIOR code_criteria = code_criteria;

В этом запросе используются два предложения CONNECT BY для создания строк для каждого значения id_criteria и code_criteria. Ключевое слово PRIOR используется для указания отношения родитель-потомок между строками.

Обратите внимание, что в этом запросе предполагается, что значения id_criteria и code_criteria разделены двоеточием или запятой. Если есть другие разделители, вам может потребоваться соответствующим образом изменить шаблон регулярного выражения.

Вот пример вывода на основе предоставленных вами образцов данных и измененного запроса:

USERNAME   IDREFVAL   CODEREFVAL
Kim        22         21-23:21-22
Tim        36         All
Sam        21         null
Sam        22         null
Sam        23         24
Sam        25         null

спасибо чжоу, но все же он пропускает много записей

Code eureka 14.02.2023 10:21

Другие вопросы по теме

Регулярное выражение с флагом m в Perl и Python
Как выполнить разделение строк, используя регулярное выражение в качестве ссылки, и чтобы часть используемого шаблона разделителя не удалялась из следующей строки?
Правильный шаблон регулярного выражения (re) в python
Как я могу преобразовать двойные косые черты в R, не сталкиваясь с ошибкой, связанной с escape-символами?
JavaScript Буквенно-цифровое регулярное выражение и разрешить звездочку в начале строки, но не разрешать звездочку в последних 4 цифрах строки
Python/regex: соответствует только букве или букве, за которой следует число
Регулярное выражение для форматирования электронной почты без hypen в начале и в конце
Как написать регулярное выражение, которое удаляет любой символ или символ, стоящий перед диапазоном указанных разделителей "(" и ")]"
Поиск по первым буквам фразы - как vscode
Удаление всех экземпляров строки, которая не находится в круглых скобках