redshift sql с использованием регулярного выражения для получения первого, второго, третьего значения из строки, которая выглядит следующим образом - PullRequest
0 голосов
/ 29 июня 2018

шаблон: d0=123;d1=134;d2=123;d3=13;d4=33;d5=44;d6=55;

Если хотите получить первое число между = & ;

output: 
123

Если я хочу получить второе вхождение между = & ;

output: 
134

Используется регулярное выражение:

select  
  regexp_substr(' d0=123;d1=134;d2=123;d3=13;d4=33;d5=44;d6=55;','d[0-9]+=' ,1,2) as b;

но вывод идет так:

d1=

Любые указатели в этом направлении будут полезны.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Другой подход - использовать вместо этого regex_substr

regex_substr(s,'[^d=;]*[0-9]+[^;=d]',1,2) 

Увеличивать / уменьшать целое значение 2 по мере необходимости.

0 голосов
/ 29 июня 2018

Вы не можете получить доступ к захваченным значениям, и регулярное выражение POSIX, используемое в Redshift, не поддерживает обходные пути.

Вы можете использовать функцию REGEXP_REPLACE. Например. чтобы извлечь седьмое значение из строки с разделителями, вы можете использовать

regexp_replace(s, '^(d[0-9]+=[^;]+;){6}d[0-9]+=([^;]+).*', '\2')

См. Демоверсию regex

Это соответствует

  • ^ - начало строки
  • (d[0-9]+=[^;]+;){6} - 6 повторений d, 1+ цифр, =, 1+ символов, отличных от ;, а затем ;
  • d[0-9]+= - d, 1+ цифр, =
  • ([^;]+) - Группа 2 (обозначается \2 из шаблона замены): 1+ символов, отличных от ;
  • .* - остаток строки.

Чтобы получить первое значение, замените {6} на {0}, второе значение можно получить с помощью {1} и т. Д.

...