Come convertire sql-text in jsonb-string?
Non sembra esserci un modo ovvio:
select 'a123'::text::jsonb= ERRORE: sintassi di input non valida per il tipo jsonselect '"a123"'::text::jsonb= Stringa BAD perché citato
controlloselect '"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
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