Transformieren von HSTORE-Array-Werten in eine Spalte in JSONB
Ich versuche, meine in der HSTORE-Spalte ("Daten") von Postgres gespeicherten Daten umzuwandeln.
Meine Zeilenwerte haben den Schlüssel "Entität" und der Wert befindet sich im Array.
"entity"=>"[{'id': .............}]
Ich habe folgenden Code verwendet:
Alter TABLE my_table
ALTER COLUMN h_store_column TYPE jsonb
USING hstore_to_jsonb_loose(data -> 'entity');
was zu einem Wert als Ausgabe in einer neuen Spalte wie unten führte:
"[{'id': .............}]"
aber mit Anführungszeichen "". Dadurch wurde es in der Spalte vom Typ JSONB skalar und lässt mich die Abfrage nicht ausführen.
Wie kann ich den Wert jeder Zeile in einer neuen Spalte namens „entity“ mit JSONB ohne Anführungszeichen ändern?
[{'id': .............}]
BEISPIELCODE ZUR ERZEUGUNG ÄHNLICHER DATEN:
"key" => "[json_text_array]"
hstorein Datentypspalte gespeichert .
Wenn ich in den JSON B-Typ geändert werde, erhalte ich {'key':'[array]'}, während ich danach bin {'key': [array]}- Keine Anführungszeichen. Ich habe lose Funktionen in Postgres ausprobiert, keine Hilfe.
Antworten
Gemäß Ihrer Frage, was ich verstanden habe, haben Sie eine Spalte mit Typ hstoremit einem Schlüssel namens entityund einem Wert als JSON ARRAY. Die Erklärung Ihres Problems und Ihrer Lösung lautet wie folgt:
- Ihre
Alterin der Frage erwähnte Abfrage wird durch einen Fehler verursacht, dahstore_to_jsonb_loosedie Funktion den Typwert akzeptierthstore, aber Sie übergebentext. Die richtige Aussage für Abfrage sollte also lauten.
Alter TABLE my_table
ALTER COLUMN h_store_column TYPE jsonb
USING hstore_to_jsonb_loose(data) -> 'entity';
- Die obige Abfrage konvertiert den
hstoreSchlüsselwert in ein jsonb-Schlüsselwertpaar und aktualisiert es in der Spalteh_store_column.
Die Funktion hstore_to_jsonb_loosekonvertiert also die Daten, aus denen Sie den Wert des Schlüssels { "entity": "[{'id':..........}]" }extrahieren , der .JSON'entity'"[{'id':..........}]"
Sie möchten Ihren abgerufenen Wert
hstore_to_jsonb_loose(data) -> 'entity'als full speichernJSON ARRAY. Ihre Daten, die als Wert in der Typspalte gespeichert sindhstore, scheinen wie aJSON, aber es ist keinJSON. InJSONsind Schlüssel und Werte (außer numerisch und boolesch) von umgeben,"aber in Ihrer Zeichenfolge ist es von umgeben'. Es kann also nicht wieJSONin einer JSONB -Spalte gespeichert werden.In Anbetracht dessen, dass es kein anderes Problem in der Struktur von Werten als JSON gibt (außer
'). Wir sollten das durch ersetzen'und"den Wert als JSONB in der Spalte speichern. Probieren Sie diese Abfrage aus, um dasselbe zu tun.
Alter TABLE test
ALTER COLUMN h_store_column TYPE jsonb
USING replace(hstore_to_jsonb_loose(data)->>'entity','''','"')::jsonb;
DEMO1
Auch hstore_to_jsonb_looseist in Ihrem Fall nicht erforderlich. Sie können Ihre AlterErklärung wie folgt schreiben:
Alter TABLE test
ALTER COLUMN h_store_column TYPE jsonb
USING replace((data)->'entity','''','"')::jsonb;
DEMO2