Trasformazione dei valori dell'array HSTORE in una colonna in JSONB
Sto cercando di trasformare i miei dati memorizzati nella colonna HSTORE ("dati") di Postgres.
I miei valori di riga hanno la chiave "entità" e il valore è nell'array.
"entity"=>"[{'id': .............}]
Ho usato il seguente codice:
Alter TABLE my_table
ALTER COLUMN h_store_column TYPE jsonb
USING hstore_to_jsonb_loose(data -> 'entity');
che ha prodotto il valore come output in una nuova colonna come di seguito:
"[{'id': .............}]"
ma, con le virgolette ""
. Questo lo ha reso scalare nella colonna di tipo JSONB e non mi consente di eseguire la query.
Come posso modificare il valore di ogni riga in una nuova colonna denominata "entità" con JSONB, senza virgolette?
[{'id': .............}]
CODICE DI ESEMPIO PER GENERARE DATI SIMILI:
"key" => "[json_text_array]"
memorizzato nella hstore
colonna del tipo di dati.
Quando sono passato al tipo JSON B, ottengo {'key':'[array]'}
, mentre sono dopo {'key': [array]}
- Senza virgolette. Ho provato funzioni sciolte in postgres, nessun aiuto.
Risposte
Secondo la tua domanda, cosa ho capito, hai una colonna con tipo hstore
con una chiave denominata entity
e valore come JSON ARRAY
. La spiegazione del problema e della soluzione sarà la seguente:
- La tua
Alter
query menzionata nella domanda sarà per errore perchéhstore_to_jsonb_loose
la funzione accetta ilhstore
valore del tipo ma stai passandotext
. Quindi l'istruzione corretta per query dovrebbe essere.
Alter TABLE my_table
ALTER COLUMN h_store_column TYPE jsonb
USING hstore_to_jsonb_loose(data) -> 'entity';
- La query sopra convertirà il
hstore
valore-chiave nella coppia valore-chiave jsonb e lo aggiornerà nella colonnah_store_column
.
Quindi la funzione hstore_to_jsonb_loose
convertirà i dati { "entity": "[{'id':..........}]" }
da cui stai estraendo il JSON
valore della chiave 'entity'
che è "[{'id':..........}]"
.
Vuoi memorizzare il tuo valore recuperato da
hstore_to_jsonb_loose(data) -> 'entity'
as fullJSON ARRAY
. I tuoi dati memorizzati come valore nellahstore
colonna di tipo sembrano unJSON
ma non è un fileJSON
. InJSON
, chiavi e valori (diversi da numerici e booleani) sono circondati da"
ma nella tua stringa è circondato da'
. Quindi non può essere memorizzato comeJSON
nella colonna di tipo JSONB .Considerando che non ci sono altri problemi nella struttura dei valori come JSON (diversi da
'
). Dovremmo sostituire'
con"
e memorizzare il valore come JSONB nella colonna. Prova questa query per fare lo stesso.
Alter TABLE test
ALTER COLUMN h_store_column TYPE jsonb
USING replace(hstore_to_jsonb_loose(data)->>'entity','''','"')::jsonb;
DEMO1
Anche hstore_to_jsonb_loose
non è richiesto nel tuo caso. Puoi scrivere la tua Alter
dichiarazione come di seguito:
Alter TABLE test
ALTER COLUMN h_store_column TYPE jsonb
USING replace((data)->'entity','''','"')::jsonb;
DEMO2