Come convertire sql-text in jsonb-string?

Nov 23 2020

Non sembra esserci un modo ovvio:

  • select 'a123'::text::jsonb= ERRORE: sintassi di input non valida per il tipo json
  • select '"a123"'::text::jsonb= Stringa BAD perché citato
    controllo select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
    per vedere che non ha citato è quello corretto .
  • select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= NON stringa

Ho bisogno di "123" e "a123" come stringhe JSONb pure .


PS: non è un duplicato della conversione automatica generica di qualsiasi cosa .

Risposte

1 ErwinBrandstetter Nov 23 2020 at 20:10

Per convertire i valori letterali stringa non tipizzati , non racchiusi tra virgolette doppie in jsonb(o json), utilizzare la funzione to_jsonb()(o to_json()):

SELECT to_jsonb(text 'a123');

Si noti che l'ingresso deve essere un tipo stringa ( text, varchar, ...), non un letterale senza tipo. È così che Postgres sa che vuoi una stringa JSON .

Quanto sopra text 'a123'è un modo per lanciare un letterale non tipizzato. Ce ne sono altri:

  • Cast del tipo di dati Postgres

Per un cast diretto a json(b), Postgres si aspetta valori letterali JSON validi (con stringhe tra virgolette ):

SELECT '"a123"'::jsonb;  

Per tradurre ogni valore in una primitiva JSON specifica, puoi eseguire il cast in modo condizionale prima della conversione. Esempio:

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 = Stringa BAD perché quotata

Per essere precisi, il risultato non è una stringa, ma un jsonbvalore contenente una stringa JSON. Per ottenere la stringa come tipo di dati Postgres text, è necessario l' ->>operatore:

select 'a123'::text  = ('{"x":"a123"}'::jsonb)->>'x'

Oppure (confrontando i valori JSON):

select '"a123"'::jsonb = ('{"x":"a123"}'::jsonb)->'x';

Ho bisogno di "123" e "a123" come stringhe JSONb pure.

Così:

SELECT '"123"'::jsonb, '"a123"'::jsonb;

Entrambi contengono stringhe JSON .

Funziona anche:

SELECT '123'::jsonb;

.. ma contiene un JSON numerica .

Ma questo non funziona:

SELECT 'a123'::jsonb;  -- error

.. perché non è un valore letterale numerico valido.

Il manuale ha una tabella di mappature tra i tipi primitivi JSON e i tipi PostgreSQL corrispondenti