PostgreSQL jsonb_array_elements()
PostgreSQL `jsonb_array_elements()` é uma função JSON usada para expandir uma matriz JSON em um conjunto de elementos JSON. Ele é particularmente útil para consultar e manipular dados JSON armazenados em bancos de dados PostgreSQL.
Uso
A função `jsonb_array_elements()` é utilizada quando você precisa processar cada elemento de uma matriz JSON individualmente. É comumente usado em conjunto com junções `LATERAL` para iterar sobre os elementos do array.
SELECT jsonb_array_elements(jsonb_column)
FROM table_name;
Nessa sintaxe, `jsonb_array_elements(jsonb_column)` desconstrói a matriz JSON em `jsonb_column` e retorna cada elemento como uma linha separada. Observe que, se a matriz estiver vazia, nenhuma linha será retornada e, se o JSON de entrada for "nulo", o resultado também será "nulo".
Exemplos
1. Uso básico
SELECT jsonb_array_elements('[1, 2, 3, 4]');
Esse exemplo gera cada número na matriz JSON `[1, 2, 3, 4]` como uma linha separada, resultando em quatro linhas.
2. Extração de elementos de uma coluna de tabela
SELECT jsonb_array_elements(data)
FROM orders;
Supondo que `data` seja uma coluna na tabela `orders` que contém matrizes JSON, essa consulta extrai e gera cada elemento das matrizes armazenadas na coluna `data`. Tenha cuidado com objetos JSON que não sejam de matriz, pois eles podem levar a erros de tempo de execução.
3. Usando com LATERAL Join
SELECT o.id, elem
FROM orders AS o, LATERAL jsonb_array_elements(o.items) AS elem;
Neste exemplo, cada elemento da matriz JSON `items` na tabela `orders` é extraído e unido à tabela `orders` para produzir uma linha para cada elemento, juntamente com o `id` do pedido. A palavra-chave `LATERAL` permite que cada linha da tabela de pedidos seja processada individualmente com sua matriz JSON correspondente.
Dicas e práticas recomendadas
- Garanta a validade do JSON. Sempre valide os dados JSON antes de usar `jsonb_array_elements()` para evitar erros de tempo de execução.
- Use LATERAL para uniões. O `LATERAL` permite que cada linha seja processada com sua matriz JSON específica, possibilitando uniões complexas.
- Filtre os resultados antecipadamente. Aplique filtros antes de expandir as matrizes para melhorar o desempenho ao trabalhar com grandes conjuntos de dados.
- Indexar colunas JSONB. Considere a possibilidade de indexar colunas JSONB para acelerar as consultas que envolvem funções JSON, especialmente quando você consulta grandes conjuntos de dados com frequência.
- Considerações sobre o desempenho. Esteja atento aos impactos no desempenho ao usar `jsonb_array_elements()` em arrays JSON grandes ou profundamente aninhados.
- Comparação com `json_array_elements()`. O `jsonb_array_elements()` é usado com dados JSONB, que são armazenados em um formato binário decomposto, oferecendo melhor desempenho do que o `json_array_elements()` em muitos casos.