2016-07-05 3 views
1

У меня возникают проблемы с вычислением границ между подстрокой. Например, для строки 063016_shape_tea_cleanse__emshptea1_ Я хочу подстроить emshptea1, но он также должен работать для строки 063016_shape_tea_cleanse__emshptea1_TESTDATA_HERE.Подстрока Teradata за пределами

В настоящее время у меня есть:

sel SUBSTR('063016_shape_tea_cleanse__emshptea1_',POSITION('__' IN '063016_shape_tea_cleanse__emshptea1_')+2, 
    POSITION('_' IN SUBSTR('063016_shape_tea_cleanse__emshptea1_',POSITION('__' IN '063016_shape_tea_cleanse__emshptea1_') + 2,CHARACTER_LENGTH('063016_shape_tea_cleanse__emshptea1_') - (POSITION('__' IN '063016_shape_tea_cleanse__emshptea1_') + 2)))-1) 

Но это erroring из-за него, пытаясь подстроки 27 -1.

+0

Итак, вы хотите, чтобы все после 'cleanse__' до следующего' _'? –

ответ

2

Вы можете использовать регулярное выражение, это будет извлекать все между __ и следующей _ или в конце строки:

REGEXP_SUBSTR(col, '(?<=__).+?(?=(_|$))') 

«(< =?)» посмотрите-сзади, то есть поиск для предыдущих символов, не добавляя его к результату. Здесь: искать __

'. +' соответствует любому символу, один или несколько раз. Это будет соответствовать до конца строки («жадный»), '?' («ленивый») предотвращает это.

'(? =)' - перспективный поиск, т. Е. Поиск следующих символов без добавления его к результату.

(|) Труба разделяет выражение в нескольких вариантах. Здесь либо символ подчеркивания, либо конец строки $

+0

Спасибо, что сработало. Не могли бы вы объяснить мне, что все символы представляют в регулярном выражении? – Bob

+0

@BobDunakey: Добавлено некоторое объяснение. Регулярные выражения довольно мощные, я знаю только основы :) – dnoeth

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