Eu tenho uma visão postgres "people_codes" que tem uma coluna que é um ARRAY_AGG de intergers. Estou tentando consultar na exibição com uma matriz de inteiros para todas as linhas que podem ter um desses códigos
uuid | name | codes
(uuid) | (varchar) | (bigint[])
abc-def | john | {5294, 5295}
bee-aaa | jane | {1123, 2222}
111-a98 | bob | {1933}
Posso consultar com êxito a exibição com apenas um inteiro para a consulta
SELECT * FROM people_codes WHERE 5294 = ANY (codes);
E isso retorna a linha que eu preciso:
abc-def | john | {5294, 5295} |
Meu objetivo final é poder consultar minha visão com um array, para que eu possa encontrar todas as linhas que tenham um ou mais dos códigos fornecidos.
Eu tentei alterar meu valor para um int, também lançando-o como :: bigint[], mas recebo um erro de sintaxe nos colchetes. Ocorre independentemente dos colchetes (, [, ou {
SELECT * FROM people WHERE [5294,1933]::bigint[] = ANY (codes);
ERROR: syntax error at or near "["
LINE 6: SELECT * FROM people WHERE [5294,1933]::bigint...
Eu também tentei usar os operadores de comparação @> e &&, mas tendo problemas com a matriz de valores novamente. Ele está tentando sugerir a adição de uma conversão de tipo explícito, que é o que eu pensei que estava fazendo. Mesma coisa com tentar colocar os valores de pesquisa em um ARRAY_AGG
SELECT * FROM people WHERE codes @> IN (5294,1933)::bigint[];
ERROR: operator does not exist: bigint[] @>
LINE 8: ...ROM people WHERE codes @> IN (529...
O que é uma consulta correta para obter linhas que contenham elementos na matriz de consulta? Ao pesquisar no Array de [5294,1933], espero obter de volta as linhas de john e bob
Conforme documentado no manual , existem duas maneiras de especificar uma constante de matriz
On é usar a
array[...]
notação:Como alternativa, use uma string que usa
{..}
Eu prefiro o primeiro, pois também não tem problemas quando o tipo de dados em si requer citação, por exemplo, para
text
matrizes.