Usando o Postgres 9.0, preciso de uma maneira de testar se existe um valor em uma determinada matriz. Até agora, eu vim com algo assim:
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
Mas continuo pensando que deveria haver uma maneira mais simples de fazer isso, simplesmente não consigo ver. Isso parece melhor:
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Eu acredito que será suficiente. Mas se você tiver outras maneiras de fazê-lo, compartilhe!
fonte
ANY/ALL (array) requires array on right side
, o add de::int[]
fez o encanto.'something' = ANY(some_array)
também podem ser usadas em umaWHERE
cláusula. Por razões conhecidas apenas pela Crom, passei os últimos quatro anos pensando que não poderia usar comparadores de matriz emWHERE
cláusulas. Esses dias se foram agora. (Eu caí na minha cabeça quando criança, então talvez seja só eu).boolean
expressão funciona naWHERE
cláusula - Crom disposto.Cuidado com a armadilha em que entrei: Ao verificar se determinado valor não está presente em uma matriz, você não deve fazer:
mas use
em vez de.
fonte
ALL
vsANY
SELECT NOT value_variable = ANY('{1,2,3}'::int[])
pode ser mais legívelVocê pode comparar duas matrizes. Se algum dos valores na matriz esquerda se sobrepuser aos valores da matriz direita, ele retorna true. É meio bobo, mas funciona.
1
está na matriz corretatrue
, mesmo que o valor4
não esteja contido na matriz correta4
) está na matriz direita, portanto, ele retornafalse
fonte
unnest
também pode ser usado. Ele expande a matriz para um conjunto de linhas e, em seguida, simplesmente verificar se um valor existe ou não é tão simples quanto usarIN
orNOT IN
.por exemplo
id => uuid
exception_list_ids => uuid []
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
fonte
Ao procurar a existência de um elemento em uma matriz, é necessária a conversão adequada para passar o analisador SQL do postgres. Aqui está um exemplo de consulta usando array contém o operador na cláusula join:
Para simplificar, listo apenas a parte relevante:
A parte de junção do SQL mostrada
O seguinte também funciona
Estou apenas supondo que a conversão extra seja necessária porque a análise não precisa buscar a definição da tabela para descobrir o tipo exato da coluna. Outros, por favor, comente sobre isso.
fonte
Oi, isso funciona bem para mim, talvez útil para alguém
selecione * da sua tabela onde array_column :: text é semelhante a ANY (ARRAY ['% text_to_search%' :: text]);
fonte