SELECT q.id, d.key, d.value
FROM q
JOIN json_each_text(q.data) d ON true
ORDER BY 1, 2;
A função
json_each_text()
é uma função de retorno de conjunto, portanto, você deve usá-la como uma fonte de linha. A saída da função está aqui unida lateralmente
para a tabela q
, o que significa que para cada linha na tabela, cada (key, value)
par dos data
coluna é unida apenas a essa linha, de modo que a relação entre a linha original e as linhas formadas a partir do json
objeto é mantido. A tabela
q
também pode ser uma subconsulta muito complicada (ou um VALUES
cláusula, como na sua pergunta). Na função, a coluna apropriada é usada a partir do resultado da avaliação dessa subconsulta, portanto, você usa apenas uma referência ao alias da subconsulta e à coluna (alias da) na subconsulta.