Разбить строку по разделителю в Oracle с помощью регулярных выражений - PullRequest
0 голосов
/ 25 февраля 2019

Мне нужно написать скрипт в Oracle, чтобы разбить строки 'BP / 593/00294' и 'NC // 12345' на / символ в запросе, чтобы иметь значения в отдельных столбцах.

Я что-то думалнапример:

select regexp_substr(mystr, '[^/]+') as col1, 
regexp_substr(c.usertext21,'[^/]+',1,2) as col2
from mytable

, но в col2 я теряю пустое строковое значение из второй строки.Мне нужно сохранить каждое значение из обеих строк.Это должно быть результатом:

<table>
<th>col1</th>
<th>col2</th>
<th>col3</th>
<tr>
  <td>BP</td>
  <td>593</td>
  <td>00294</td>
</tr>
<tr>
  <td>NC</td>
  <td></td>
  <td>12345</td>
</tr>
</table>

Любая помощь будет оценена.Спасибо

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Если у вас есть неизвестное количество разделений, которые нужно отловить, и вы хотите, чтобы каждое разделение было отдельной строкой, вы можете использовать команду connect by:

with example as (
   select 'NC//12345/12qwe/////12sadf' text from dual
)
 select regexp_substr(e.text, '[^/]+', 1, LEVEL) col
   from example e
connect by regexp_instr(e.text, '[/]+', 1, LEVEL - 1) > 0

Демо

0 голосов
/ 25 февраля 2019

Вы можете захватить 0 или более символов, отличных от / в начале строки или после /:

select 
  regexp_substr('BP/593/00294', '(^|/)([^/]*)') as col1,
  regexp_substr('BP/593/00294', '(^|/)([^/]*)', 1, 2, null, 2)  as col2,
  regexp_substr('BP/593/00294', '(^|/)([^/]*)', 1, 3, null, 2)  as col3
from dual

enter image description here

См. онлайн-демонстрацию .

Подробности

  • (^|/) - Группа захвата 1: начало строки или /
  • ([^/]*) - Захват группы 2: любые 0 или более символов, кроме /.

Обратите внимание на аргумент 2, который извлекает значение группы 2.См. regex demo .

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