Wie konvertiere ich SQL-Text in Jsonb-String?
Es scheint keinen offensichtlichen Weg zu geben:
select 'a123'::text::jsonb
= ERROR: Ungültige Eingabesyntax für Typ jsonselect '"a123"'::text::jsonb
= SCHLECHTER String, da in Anführungszeichen
geprüft wirdselect '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
, ob nicht in Anführungszeichen gesetzt ist .select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';
= NICHT Zeichenfolge
Ich brauche '123' und 'a123' als reine JSONb-Strings .
PS: Es ist kein Duplikat der generischen automatischen Konvertierung .
Antworten
Um nicht typisierten zu konvertieren Stringliterale , die sind nicht eingewickelt in doppelte Anführungszeichen zu jsonb
(oder json
), verwenden Sie die to_jsonb()(oder to_json()
) Funktion:
SELECT to_jsonb(text 'a123');
Beachten Sie, dass die Eingabe einen String - Typ sein muss ( text
, varchar
, ...), kein untypisierten wörtlich zu nehmen . So weiß Postgres, dass Sie eine JSON- Zeichenfolge möchten .
Das Obige text 'a123'
ist eine Möglichkeit, ein untypisiertes Literal zu verwenden. Da sind andere:
- Postgres-Datentyp umgewandelt
Für eine direkte json(b)
Umwandlung erwartet Postgres gültige JSON-Literale (mit Zeichenfolgen in doppelten Anführungszeichen ):
SELECT '"a123"'::jsonb;
Um jeden Wert in ein bestimmtes JSON-Grundelement zu übersetzen, können Sie ihn vor der Konvertierung bedingt umwandeln. Beispiel:
SELECT p, CASE WHEN i>2 THEN to_jsonb(p::numeric) ELSE to_jsonb(p) END AS x
FROM unnest('{ab,12,12,1.2}'::text[]) WITH ORDINALITY t(p,i);
select '"a123"'::text::jsonb
= BAD string weil zitiert
Um genau zu sein, ist das Ergebnis keine Zeichenfolge, sondern ein jsonb
Wert, der eine JSON-Zeichenfolge enthält. Um die Zeichenfolge als Postgres-Datentyp abzurufen text
, benötigen Sie den ->>
Operator:
select 'a123'::text = ('{"x":"a123"}'::jsonb)->>'x'
Oder (Vergleichen von JSON-Werten):
select '"a123"'::jsonb = ('{"x":"a123"}'::jsonb)->'x';
Ich brauche '123' und 'a123' als reine JSONb-Strings.
Damit:
SELECT '"123"'::jsonb, '"a123"'::jsonb;
Beide enthalten JSON- Zeichenfolgen .
Das funktioniert auch:
SELECT '123'::jsonb;
.. enthält aber eine JSON- Zahl .
Das funktioniert aber nicht:
SELECT 'a123'::jsonb; -- error
.. weil es kein gültiges numerisches Literal ist.
Das Handbuch enthält eine Tabelle mit Zuordnungen zwischen primitiven JSON-Typen und entsprechenden PostgreSQL-Typen