2015-02-13 3 views
1

У меня есть столбец с именем comment, который может содержать определенный шаблон целых 5 раз, и я хотел бы вернуть все из них. Вот значение у меня в Colum:Верните шаблон несколько раз

oijdwe wbjcwe SBR ('JOJ.TTT.ABC', тест) sdfjksj dlkfjs LKF qweiuh ('JOJ.TTT.123', тест) oiiqwd м lskc Цюй я ('JOJ.TTT.452', тест) КСД sdfskq AZX ('JOJ.TTT.ACD5', тест)

Я хотел бы возвращать следующие значения: JOJ.TTT.ABC, JOJ.TTT.123, JOJ.TTT.452 и JOJ.TTT.ACD5

при использовании следующего описания

select 
    regexp_substr(comment,'JOJ.T{3}.{4}',1,1) 
    ,regexp_substr(comment,'JOJ.T{3}.{4}',1,2) 
    ,regexp_substr(comment,'JOJ.T{3}.{4}',1,3) 
    ,regexp_substr(comment,'JOJ.T{3}.{4}',1,4) 
    ,regexp_substr(comment,'JOJ.T{3}.{4}',1,5) 
from blabla 

он отлично работает, если шаблон JOJ.TTT.XXX, но не в случае, если после «TTT» есть 4 символа. Я знаю, что это из-за {4} я использую. Как я могу получить результат, который я хочу?

Благодаря

+1

Я не знаком с sql, поэтому могу только прокомментировать часть регулярного выражения. Вы можете попытаться изменить 'JOJ.T {3}. {4}' to 'JOJ \ .T {3} \. [A-Z0-9] *'. – SSC

ответ

0

Я нашел, как это исправить

select 
    regexp_substr(comment,'JOJ.T[^'']+',1,1) 
    ,regexp_substr(comment,'JOJ.T[^'']+',1,2) 
    ,regexp_substr(comment,'JOJ.T[^'']+',1,3) 
    ,regexp_substr(comment,'JOJ.T[^'']+',1,4) 
    ,regexp_substr(comment,'JOJ.T[^'']+',1,5) 
from blabla 
2

Использование [^']+ чтобы соответствовать до следующего '.

select 
     regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,1) a, 
     regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,2) b, 
     regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,3) c, 
     regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,4) d, 
     regexp_substr(comment_,q'!JOJ.T{3}[^']+!',1,5) e 
from blabla; 

Я изменил comment в comment_ поскольку comment является зарезервированным ключевым словом в Oracle.

1

Пока . в регулярном выражении работает для этой цели, он также будет соответствовать тем вещам, которые вы не хотите, поскольку это подстановочный знак. Используйте \. в соответствии с буквами .. Вы можете также использовать LEVEL и CONNECT BY поэтому вам не нужно выписывать несколько вызовов REGEXP_SUBSTR() явно:

WITH x AS (
    SELECT 'oijdwe wbjcwe sbr (''JOJ.TTT.ABC'', test) sdfjksj dlkfjs lkf qweiuh (''JOJ.TTT.123'', test) oiiqwd m lskc qu i (''JOJ.TTT.452'', test) ksd sdfskq azx (''JOJ.TTT.ACD5'', test)' AS comment1 
    FROM dual 
) 
SELECT REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL) 
    FROM x 
CONNECT BY REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL) IS NOT NULL; 

See SQL Fiddle here.

Это становится немного kludgier, если у вас есть несколько столбцов и хотите вернуть им все:

WITH x AS (
    SELECT 1 AS id, 'oijdwe wbjcwe sbr (''JOJ.TTT.ABC'', test) sdfjksj dlkfjs lkf qweiuh (''JOJ.TTT.123'', test) oiiqwd m lskc qu i (''JOJ.TTT.452'', test) ksd sdfskq azx (''JOJ.TTT.ACD5'', test)' AS comment1 
    FROM dual 
    UNION ALL 
    SELECT 2 AS id, 'oijdwe wbjcwe sbr (''JOJ.TTT.ABC'', test) sdfjksj dlkfjs lkf qweiuh (''JOJ.TTT.123'', test) oiiqwd m lskc qu i (''JOJ.TTT.452'', test) ksd sdfskq azx (''JOJ.TTT.ACD5'', test)' AS comment1 
    FROM dual 
) 
SELECT id, REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL) 
    FROM x 
CONNECT BY REGEXP_SUBSTR(comment1,'JOJ\.TTT\.[A-Z0-9]+', 1, LEVEL) IS NOT NULL 
    AND PRIOR id = id 
    AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL; 

See SQL Fiddle here. Без PRIOR положений Oracle вернет перекрестное соединение значений id и из comment1.

Кстати, COMMENT является зарезервированным словом Oracle, и указанные выше запросы не работали в 11g r2 с столбцом с именем comment. Вот почему я использовал comment1.

Альтернативно, вы можете использовать [^'']+ вместо [A-Z0-9]+, но, учитывая ваши данные примера, я не уверен, что это то, что вы хотите.

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