2016-08-02 4 views
0

У меня есть следующее выражение: 15-JUL-16,20-JUL-16,20-JUL-16,30-JUL-16 в одном из моих столбцов.Sql Orcle: Regexp_substr

Я успешно использовал SUBSTR(REGEXP_SUBSTR(base.systemdate, '.+,'), 1, 9), чтобы получить 15-JUL-16 (выражение до первой запятой) из выражения.

Но я, черт возьми, не могу понять, как получить 30-JUL-16 (последнее выражение после последней запятой).

Есть ли способ использовать REGEXP_SUBSTR, чтобы получить это? И так как мы на нем.

Есть ли опрятный способ использовать только REGEXP_SUBSTR, чтобы получить 15-JUL-16 без запятой? Потому что я использую второй SUBSTR, чтобы избавиться от запятой, поэтому я могу получить его совместимым с форматом данных.

+0

Не храните данные как элементы, разделенные запятой, имеют одно значение для каждого столбца/строки. – jarlh

+1

Вы хотите разделить строку, разделенную запятыми. Этот вопрос задавали и отвечали так много раз - просто Google для «Oracle split csv» или такого. – mathguy

+0

Спасибо за предложение, но я не могу контролировать способ хранения данных в нашем хранилище данных. Я просто работаю с тем, что получаю. Но повторить мой вопрос. Как я могу переписать SUBSTR (REGEXP_SUBSTR (base.systemdate, '. +,'), 1, 9), чтобы использовать REGEXP_SUBSTR без дополнительного SUBSTR, чтобы получить первую дату перед первой запятой без запятой? –

ответ

0

Вы можете использовать очень похожую конструкцию:

SELECT REGEXP_SUBSTR(base.systemdate, '[^,]+$') 

Oracle (и регулярные выражения в целом) являются "жадными". Это означает, что они берут самую длинную строку. Если вы знаете, элементы в списке все той же длины, вы могли бы просто использовать:

SELECT SUBSTR(ase.systemdate, -9) 
+0

Спасибо большое :) Дело в том, что длина выражения меняется. Иногда бывает 2 даты, иногда 4, иногда 6. И меня всегда интересует первая и последняя (без запятой), поэтому я могу работать с ней в качестве дат в будущем. –

+0

Вы имели в виду '[^,] +'? - отсутствует +. – mathguy

+0

yep. + Вещь отсутствовала. :) Но в остальном он работает. И как я могу переписать SUBSTR (REGEXP_SUBSTR (base.systemdate, '. +,'), 1, 9), чтобы использовать REGEXP_SUBSTR без дополнительного SUBSTR, чтобы получить первую дату перед первой запятой без запятой? –

0

Попробуйте

select dates from 
    (
     SELECT dates,max(id) over (partition by null) lastrec,min(id) over (partition by null) firstrec,id FROM (
      with mine as(select '15-JUL-16,20-JUL-16,20-JUL-16,30-JUL-16' hello from dual) 
       select rownum id,regexp_substr(hello, '[^,]+', 1, level) dates from mine 
       connect by regexp_substr(hello, '[^,]+', 1, level) is not null) 
    ) 
    where id=firstrec or id=lastrec 

этот запрос даст вам первый и последний запись из списка разделенных запятыми.