Может ли Redshift SQL выполнять оценку регулярного выражения без учета регистра?

Документация гласит, что regexp_instr() и ~ чувствительны к регистру функции и оператора Posix. Есть ли синтаксис Posix для нечувствительных к регистру, или плагин для PCRE функции или оператора

Пример использования PCRE в запросе Redshift, который не работает должным образом из-за POSIX.

select 
  A.target
, B.pattern
, regexp_instr(A.target, B.pattern) as rx_instr_position
, A.target ~ B.pattern as tilde_operator
, regexp_instr(A.target
, 'm/'||B.pattern||'/i') as rx_instr_position_icase
from
(      select 'AbCdEfffghi' as target 
 union select 'Chocolate' as target 
 union select 'Cocoa Latte' as target 
 union select 'coca puffs, delivered late' as target
) A
,
(      select 'choc.*late' as pattern 
 union select 'coca.*late' as pattern 
 union select 'choc\w+late' as pattern
 union select 'choc\\w+late' as pattern
) B

1 ответ

Чтобы ответить на ваш вопрос: Нет знакомого мне Redshift-совместимого синтаксиса или плагинов. В случае, если вы можете жить с обходным путем: мы в конечном итоге использовали lower() вокруг строк, чтобы соответствовать:

select
  A.target
, B.pattern
, regexp_instr(A.target, B.pattern) as rx_instr_position
, A.target ~ B.pattern as tilde_operator
, regexp_instr(A.target, 'm/'||B.pattern||'/i') as rx_instr_position_icase
, regexp_instr(lower(A.target), B.pattern) as rx_instr_position_icase_by_lower
from
(      select 'AbCdEfffghi' as target
 union select 'Chocolate' as target
 union select 'Cocoa Latte' as target
 union select 'coca puffs, delivered late' as target
) A
,
(      select 'choc.*late' as pattern 
 union select 'coca.*late' as pattern 
 union select 'choc\w+late' as pattern
 union select 'choc\\w+late' as pattern
) B

select 'HELLO' ~* 'el' = правда

в настоящее время это недокументировано (2020-11-05)

Redshift теперь предоставляет прямое решение для флагов регулярных выражений без учета регистра через добавленные параметры функции: Amazon Redshift - REGEXP_INSTR

Синтаксис с использованием предоставленного примера запроса будет следующим:

select
  A.target
, B.pattern
, regexp_instr(A.target, B.pattern) as rx_instr_position
, A.target ~ B.pattern as tilde_operator
, regexp_instr(A.target, B.pattern, 1, 1, 0, 'i') AS rx_instr_position_icase
from
(      select 'AbCdEfffghi' as target
 union select 'Chocolate' as target
 union select 'Cocoa Latte' as target
 union select 'coca puffs, delivered late' as target
) A
,
(      select 'choc.*late' as pattern 
 union select 'coca.*late' as pattern 
 union select 'choc\w+late' as pattern
 union select 'choc\\w+late' as pattern
) B
Другие вопросы по тегам