Transformando valores de array HSTORE em uma coluna em JSONB
Estou tentando transformar meus dados armazenados na coluna HSTORE ('data') do Postgres.
Meus valores de linha têm a chave "entidade" e o valor está na matriz.
"entity"=>"[{'id': .............}]
Eu usei o seguinte código:
Alter TABLE my_table
ALTER COLUMN h_store_column TYPE jsonb
USING hstore_to_jsonb_loose(data -> 'entity');
que resultou em valor como saída em uma nova coluna conforme abaixo:
"[{'id': .............}]"
mas, com aspas "". Isso tornou escalar na coluna do tipo JSONB e não me permite executar a consulta.
Como posso alterar o valor de cada linha em uma nova coluna chamada 'entidade' com JSONB, sem aspas?
[{'id': .............}]
CÓDIGO DE AMOSTRA PARA GERAR DADOS SEMELHANTES:
"key" => "[json_text_array]"
armazenados na hstorecoluna de tipo de dados.
Quando alterado para o tipo JSON B, recebo {'key':'[array]'}, enquanto estou atrás {'key': [array]}- Sem aspas. Tentei funções soltas no postgres, sem ajuda.
Respostas
De acordo com sua pergunta, o que eu entendi, você tem uma coluna com tipo hstorecom uma chave nomeada entitye valor como JSON ARRAY. A explicação do seu problema e solução será como:
- Sua
Alterconsulta mencionada na pergunta será por erro porque ahstore_to_jsonb_loosefunção aceitahstoreo valor do tipo, mas você está passandotext. Portanto, a instrução correta para a consulta deve ser.
Alter TABLE my_table
ALTER COLUMN h_store_column TYPE jsonb
USING hstore_to_jsonb_loose(data) -> 'entity';
- A consulta acima converterá o
hstorevalor-chave em um par de valor-chave jsonb e o atualizará na colunah_store_column.
Portanto, a função hstore_to_jsonb_looseconverterá os dados a partir { "entity": "[{'id':..........}]" }dos quais você está extraindo o JSONvalor da chave 'entity'que é "[{'id':..........}]".
Você deseja armazenar seu valor buscado
hstore_to_jsonb_loose(data) -> 'entity'como fullJSON ARRAY. Seus dados armazenados como valor nahstorecoluna de tipo parecem umJSON, mas não são umJSON. EmJSON, chaves e valores (que não sejam numéricos e booleanos) são cercados por,"mas em sua string ele é cercado por'. Portanto, não pode ser armazenado comoJSONna coluna do tipo JSONB .Considerando que não há outro problema na estrutura de valores como JSON (além de
'). Devemos substituir'por"e armazenar o valor como JSONB na coluna. Tente esta consulta para fazer o mesmo.
Alter TABLE test
ALTER COLUMN h_store_column TYPE jsonb
USING replace(hstore_to_jsonb_loose(data)->>'entity','''','"')::jsonb;
DEMO1
Mesmo hstore_to_jsonb_loosenão é necessário no seu caso. Você pode escrever sua Alterdeclaração como abaixo:
Alter TABLE test
ALTER COLUMN h_store_column TYPE jsonb
USING replace((data)->'entity','''','"')::jsonb;
DEMO2