Existe um operador no PostgreSQL para testar se um elemento está em um array?
Atualmente, estou fazendo esses testes de uma maneira um pouco complexa, primeiro construindo uma matriz singleton para o elemento e, em seguida, usando o <@
operador entre matrizes.
SELECT ARRAY[1] <@ ARRAY[1,2,3];
( SELECT 1 <@ ARRAY[1,2,3];
não funciona).
Existe uma maneira mais sucinta/clara?
Supondo que o elemento a ser verificado seja never
NULL
, seu método originaloferece desempenho superior na presença de um índice correspondente para a coluna da matriz
int[]
( no seu exemplo). Ver:Se for tudo sobre
integer
arrays, considere o módulo adicionalintarray
para um desempenho superior.Se sua coluna realmente for o elemento de matriz na expressão (simples
integer
em seu exemplo), considere:OTOH, se
NULL
os valores puderem estar envolvidos em ambos os lados da expressão e você não quiser entrada, trateNULL
como qualquer outro elemento, use (Postgres 9.5 ou posterior) assim:NULL
NULL
array_position()
Relacionado:
Para testes sem suporte de índice e sem
NULL
valores envolvidos (ou se você estiver satisfeito comNULL
aNULL
entrada) e o desempenho não for importante, use aANY
construção genérica como Vérace demonstra .Você precisa usar a
ANY
construção!Para responder sua pergunta, fiz o seguinte:
Criei uma tabela:
Adicionados alguns registros de amostra:
Executei minha consulta:
O violino está disponível aqui . Espero que isso responda sua pergunta - se não, por favor me avise!