Извлечь число из строки, разделенной запятыми, используя регулярные выражения в oracle sql - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь получить число, начинающееся с 628 в строке через запятую.Ниже приводится то, что я использую:

SELECT 
    REGEXP_REPLACE(REGEXP_SUBSTR('62810,5152,,', ',?628[[:alnum:]]+,?'),',','') first,
    REGEXP_REPLACE(REGEXP_SUBSTR('5152,62810,,', ',?628[[:alnum:]]+,?'),',','') second,
    REGEXP_REPLACE(REGEXP_SUBSTR('5152,562810,,', ',?628[[:alnum:]]+,?'),',','') third,
    REGEXP_REPLACE(REGEXP_SUBSTR(',5152,,62810', ',?(628[[:alnum:]]+),?'),',','') fourth
FROM DUAL;

Работает, но в одном случае он не работает, это третий столбец с номером 562810. На самом деле я ожидаю NULL в третьем столбце.

Фактический результат запроса выше:

"FIRST","SECOND","THIRD","FOURTH"
"62810","62810","62810","62810"

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Не уверен, почему вы используете [[:alnum::]].Вы можете использовать соответствующую группу, чтобы извлечь число, начинающееся с 628 или запятой.REPLACE можно избежать таким образом

Если у вас есть и алфавиты, соответственно измените 2-ую группу совпадений ().

SELECT 
    REGEXP_SUBSTR('62810,5152,,' , '(^|,)(628\d*)',1,1,NULL,2) first,
    REGEXP_SUBSTR('5152,62810,,' , '(^|,)(628\d*)',1,1,NULL,2) second,
    REGEXP_SUBSTR('5152,562810,,', '(^|,)(628\d*)',1,1,NULL,2) third,
    REGEXP_SUBSTR(',5152,,62810' , '(^|,)(628\d*)',1,1,NULL,2) fourth
FROM DUAL;

Демо

0 голосов
/ 11 мая 2018

Проблема с вашей логикой регулярных выражений заключается в том, что вы ищете необязательную запятую перед числами 628. Это означает, что любое число, имеющее 628 в любом месте, будет совпадать. Вместо этого вы можете сформулировать это, выполнив поиск 628, которому предшествует либо запятая, или начало строки.

SELECT
    REGEXP_REPLACE(REGEXP_SUBSTR('62810,5152,,', '(,|^)628[[:alnum:]]+,?'),',','') first,
    REGEXP_REPLACE(REGEXP_SUBSTR('5152,62810,,', '(,|^)628[[:alnum:]]+,?'),',','') second,
    REGEXP_REPLACE(REGEXP_SUBSTR('5152,562810,,', '(,|^)628[[:alnum:]]+,?'),',','') third,
    REGEXP_REPLACE(REGEXP_SUBSTR(',5152,,62810', '(,|^)(628[[:alnum:]]+),?'),',','') fourth
FROM DUAL

enter image description here

Демо

Идеальный образец, который мы хотели бы использовать здесь, это \b628.*, или что-то в этом роде. Но функции регулярных выражений Oracle не поддерживают границы слов, поэтому мы можем использовать (^|,)628.* в качестве альтернативы.

...