Estou tentando mudar de ILIKE para o operador ~* do Postgres. As tabelas têm colunas bpchar (não podem ser alteradas). Tentei no Postgres 12
create temp table test ( tasudok char(25), nimetus char (100) ) on commit drop ;
insert into test values ('123','Teie Arve 123 tasumine');
select nimetus ~* '*. '||tasudok||' *.' from test;
mas deu erro
ERRO: expressão regular inválida: operando quantificador inválido
Como usar correspondência de substring com o operador ~*?
Simplesmente:
Você não precisa preencher o padrão como faria com
ILIKE
. Equivalente 1 :1 Exceto para caracteres especiais na coluna "pattern"
tasudok
que teriam significado diferente. Veja:Precedência do operador
Notavelmente,
ILIKE
eLIKE
classifique um passo abaixo dos operadores padrão na precedência do operador, então nenhum parênteses é necessário para minha expressão. A rigor,LIKE
não é um operador, mas uma construção SQL, que é implementada com o operador Postgres~~
internamente. (~~*
forILIKE
,!~~
forNOT LIKE
,!~~*
forNOT ILIKE
)Também notavelmente, esses operadores internos têm precedência de operador padrão (assim como os operadores regex
~
,~*
,!~
, e!~*
). Portanto, parênteses são necessários ao redor da string concatenada para eles.É que você não precisa concatenar nada para começar com seu exemplo. Seria um ruído caro.
Seu
*.
provavelmente deveria ser.*
e está invertido por algum motivo. O leading*
espera ser precedido por algo, mas está bem no início do padrão, daí o erro. Inverta-os e funcionará perfeitamente:demo em db-fiddle
9.7.3.1. Detalhes da expressão regular tem uma nota alertando justamente sobre isso:
Você provavelmente também quer colocar entre parênteses as strings concatenadas, caso contrário elas serão avaliadas da esquerda para a direita. Como resultado, apenas a primeira é correspondida, e o resultado
boolean
é convertido paratext
, então concatenado paratasudok
, então para' *.'
: