Transformieren von HSTORE-Array-Werten in eine Spalte in JSONB

Aug 22 2020

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

2 AkhileshMishra Aug 24 2020 at 00:01

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:

  1. Ihre Alterin der Frage erwähnte Abfrage wird durch einen Fehler verursacht, da hstore_to_jsonb_loosedie Funktion den Typwert akzeptiert hstore, aber Sie übergeben text. 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';
  1. Die obige Abfrage konvertiert den hstoreSchlüsselwert in ein jsonb-Schlüsselwertpaar und aktualisiert es in der Spalte h_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':..........}]"

  1. Sie möchten Ihren abgerufenen Wert hstore_to_jsonb_loose(data) -> 'entity'als full speichern JSON ARRAY. Ihre Daten, die als Wert in der Typspalte gespeichert sind hstore, scheinen wie a JSON, aber es ist kein JSON. In JSONsind Schlüssel und Werte (außer numerisch und boolesch) von umgeben, "aber in Ihrer Zeichenfolge ist es von umgeben '. Es kann also nicht wie JSONin einer JSONB -Spalte gespeichert werden.

  2. 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