2013-07-30 3 views
1

У меня есть ниже выборочных значений в столбцеOracle SQL: REGEXP_SUBSTR

Abc-123-xyz 
Def-456-uvw 
Ghi-879-rst-123 
Jkl-abc 

Ожидаемый результат является третьим элементом расщепляется «-», в случае, если нет третьего элемента, последний элемент будет извлечь.

См ожидаемый результат ниже:

Xyz 
Uvw 
Rst 
Abc 

Спасибо заранее за помощь.

+1

Добро пожаловать на переполнение стека. Вы можете отформатировать исходный код и образцы данных с помощью кнопки панели инструментов «Код образца» {} '] (http://i.stack.imgur.com/VYd26.png). На этот раз я сделал это для вас. –

+0

его не regex_substr в заголовке вопроса, oracle есть regexp_substr – ajmalmhd04

+0

Спасибо всем за редактирование. улучшит следующий в моем вопросе. – Ianthe

ответ

2
SELECT initcap(nvl(regexp_substr(word, '[^-]+', 1,3),regexp_substr(word, '[^-]+', 1,2))) FROM your_table; 
+0

Спасибо за ответ^_^ – Ianthe

2

Другой подход:

SQL> with t1(col) as(
    2 select 'Abc-123-xyz'  from dual union all 
    3 select 'Def-456-uvw'  from dual union all 
    4 select 'Ghi-879-rst-123' from dual union all 
    5 select 'Jkl-Abc'   from dual 
    6 ) 
    7 select regexp_substr(col 
    8      , '[^-]+' 
    9      , 1 
10      , case 
11       when regexp_count(col, '[^-]+') >= 3 
12       then 3 
13       else regexp_count(col, '[^-]+') 
14      end 
15      ) as res 
16 from t1 
17 ; 

Результат:

RES 
--------------- 
xyz 
uvw 
rst 
Abc 
+1

Просто обратите внимание, что REGEXP_COUNT() был введен только в 11g (другие функции регулярных выражений были доступны в 10g) – APC

1
regexp_substr(column, '(.*?-){0,2}([^-]+)', 1, 1, '', 2) 
0

Вы также можете сделать это без регулярных выражений:

with t1 as(
    select 'Abc-123-xyz' as MyText  from dual union all 
    select 'Def-456-uvw'  from dual union all 
    select 'Ghi-879-rst-123' from dual union all 
    select 'Jkl-Abc'   from dual 
) 
SELECT 
    SUBSTR(t1.mytext, LENGTH(t1.mytext) - INSTR(REVERSE(t1.mytext), '-') + 2) 
FROM t1 
; 
+0

вернул '123' вместо' Rst' - http://sqlfiddle.com/ #! 4/d41d8/15215 – turbanoff

+0

^правда, по моей вине, я думал, что он всегда хотел получить последнюю тройку персонажей ... – AKDADEVIL

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