2015-08-26 4 views
0

Я хотел бы вернуть значение NULL после того, как разделитель ** не найден в строке с использованием Oracle. Я есть строкаКак вернуть NULL в regex

first path**second path 

Я хочу, чтобы вырезать строку после разделителя ** и я использую регулярное выражение

REGEXP_SUBSTR(str , '[^**]*$') 

В результате correct.It возвращение second path. Но мне нужно, когда строка не имеет разделителя ** (например, firstpathsecondpath) и ему нужно вернуть NULL. Что я должен изменить для своего регулярного выражения? В настоящее время regexp возвращает целую строку, когда нет разделителя **.

+1

Просто замечание : ваше регулярное выражение неверно - оно соответствует любой последовательности символов, отличных от звездочки, в конце строки (вы можете протестировать ее с помощью «третьего» четвертого слова - она ​​вернется «четвертая»). –

+0

@FrankSchmitt Нет. Я уже тестировал, что вы сказали. Он возвращает NULL –

+0

Нет, это не так: 'select REGEXP_SUBSTR ('third * 4th', '[^ **] * $') из double' возвращает' 4th'. –

ответ

4

Этот запрос возвращает NULL, если две звездочки с последующим текстом не найдены в исходной строке:

WITH t AS (SELECT 'first path**second path' text FROM DUAL 
      UNION 
      SELECT 'third pathfourth path' text FROM DUAL) 
SELECT SUBSTR(REGEXP_SUBSTR(t.text,'(\*{2})(.+)'),3) 
FROM t 
+0

Обратите внимание, что '[\ * \ *] {2}' эквивалентно '\ * {2}' или '\ * \ *'. –

+0

Полностью rigth @AndreaCorbellini. Ред. – pablomatico

1

Вы получаете исходную строку, когда нет совпадения. Используйте случай выбора, проверяя двойной знак. когда нашел, вернуть вторую часть, когда нет, возвращать NULL:

SQL> with tbl(rownbr, str) as (
    select 1, 'first path**second path' from dual 
    union 
    select 2, 'third pathfourth path' from dual 
    ) 
    select rownbr, str, case REGEXP_INSTR(str , '\*\*') 
    when 0 then 
     NULL 
    else 
     REGEXP_SUBSTR(str , '[^**]*$') 
     end data 
    from tbl; 

    ROWNBR STR      DATA 
---------- ----------------------- ----------------------- 
     1 first path**second path second path 
     2 third pathfourth path 

SQL> 
Смежные вопросы