Извлечение идентификатора (числового) из поля в Teradata, где позиция меняется - PullRequest
1 голос
/ 19 июня 2019

Я делаю сложное соединение, используя идентификатор из столбца описания, где позиция идентификатора меняется.

Проблема в том, что есть 2 8-значных идентификатора, а код тянет 1-й,или ДЕЛО =.Мне нужно, чтобы вытащить ACT =.Как мне это сделать?

CASE WHEN REQUEST_DSC LIKE '%ACT=%' 
     THEN RegExp_Substr(REQUEST_DSC, '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
END

Поле описания вводится вручную и часто (но не всегда, следовательно, не использует идентификатор позиции) форматируется следующим образом:

CASE=00000000,ACT=00000000. 

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Данные выглядят как список пар имя / значение.

Существует встроенная функция для извлечения значений из такого списка:

Nvp(REQUEST_DSC, 'ACT', ',', '=')

Но это будет работать только в том случае, если разделителивсегда одинаковы, т. е. ',' и '=', и он чувствителен к регистру, т. е. 'act=00000000' не будет найден

В противном случае вы можете упростить Гордону RegEx.Найдите 'ACT=', не добавляя его ('\K') к общему совпадению, а затем верните следующие цифры ('\d').i запрашивает совпадение без учета регистра:

RegExp_Substr(REQUEST_DSC, 'ACT=\K\d{8}',   1, 1, 'i') -- exactly 8 digits
RegExp_Substr(REQUEST_DSC, 'ACT=\K\d{1,8}', 1, 1, 'i') -- 1 to 8 digits
RegExp_Substr(REQUEST_DSC, 'ACT=\K\d+',     1, 1, 'i') -- any number of digitd
0 голосов
/ 19 июня 2019

Простой обходной путь - извлечь ACT= и использовать SUBSTR():

CASE WHEN REQUEST_DSC LIKE '%ACT=%' 
     THEN SUBSTR(RegExp_Substr(REQUEST_DSC, 'ACT=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), 5)
END
...