Разделить строку с помощью разделителей и поместить их в несколько строк в 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
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
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
Удаление всех экземпляров строки, которая не находится в круглых скобках