Em alguma etapa de uma função plpgsql eu preciso armazenar um resultado de consulta 2D em variáveis de matriz.
O código a seguir faz o trabalho para escalares (mas falha com matrizes):
SELECT col_a, col_b
FROM my_table
WHERE col_c = condition
INTO var_a, var_b;
O seguinte faz o trabalho para UMA coluna e UMA variável de matriz, mas não mais do que isso:
SELECT ARRAY(
SELECT col_a
FROM my_table
WHERE col_c > condition
) INTO arr_a;
Como eu poderia armazenar várias linhas de col_a, b, c, d... em suas respectivas variáveis de matriz sem ter que fazer uma consulta separada para cada coluna? Como no primeiro exemplo de código, mas para várias linhas e matrizes.
Use
array_agg()
para construir as matrizes. Cuidado, ele também agregaráNULL
, portanto, certifique-se de que é isso que você deseja.dbfiddle com dados e funções de exemplo.
Estou assumindo que o predicado on
col_c
se destina a ser o mesmo paracol_a
ecol_b
. Você terá que usarFILTER
ou alguma outra construção se eles exigirem predicados separados. Eu coloquei um exemplo deFILTER
no violino.Tabela de entrada:
Função:
Resultado:
Referência: https://www.postgresql.org/docs/current/functions-aggregate.html