Wie konvertiere ich SQL-Text in Jsonb-String?

Nov 23 2020

Es scheint keinen offensichtlichen Weg zu geben:

  • select 'a123'::text::jsonb= ERROR: Ungültige Eingabesyntax für Typ json
  • select '"a123"'::text::jsonb= SCHLECHTER String, da in Anführungszeichen
    geprüft wird select '"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

1 ErwinBrandstetter Nov 23 2020 at 20:10

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 jsonbWert, 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