Bagaimana cara mengubah sql-text menjadi jsonb-string?
Sepertinya tidak ada cara yang jelas:
select 'a123'::text::jsonb= ERROR: sintaks input tidak valid untuk tipe jsonselect '"a123"'::text::jsonb= BAD string karena
cek dikutipselect '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
untuk melihat bahwa non-kutipan adalah benar .select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= BUKAN string
Saya membutuhkan '123' dan 'a123' sebagai string JSONb murni .
PS: ini bukan duplikat dari konversi apa pun otomatis yang umum .
Jawaban
Untuk mengonversi literal string tanpa tipe , yang tidak dibungkus dengan tanda kutip ganda menjadi jsonb(atau json), gunakan fungsi to_jsonb()(atau to_json()):
SELECT to_jsonb(text 'a123');
Perhatikan bahwa input harus menjadi tipe string ( text, varchar, ...), bukan literal untyped. Begitulah cara Postgres tahu Anda menginginkan string JSON .
Di atas text 'a123'adalah salah satu cara untuk menampilkan literal yang tidak diketik. Ada yang lainnya:
- Tipe data postgres cast
Untuk cast langsung ke json(b), Postgres mengharapkan literal JSON yang valid (dengan string yang dikutip ganda ):
SELECT '"a123"'::jsonb;
Untuk menerjemahkan setiap nilai ke primitif JSON tertentu, Anda dapat mentransmisikan secara bersyarat sebelum konversi. Contoh:
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= String BURUK karena dikutip
Tepatnya, hasilnya bukanlah string, tetapi jsonbnilai yang berisi string JSON. Untuk mendapatkan string sebagai tipe data Postgres text, Anda memerlukan ->>operator:
select 'a123'::text = ('{"x":"a123"}'::jsonb)->>'x'
Atau (membandingkan nilai JSON):
select '"a123"'::jsonb = ('{"x":"a123"}'::jsonb)->'x';
Saya membutuhkan '123' dan 'a123' sebagai string JSONb murni.
Begitu:
SELECT '"123"'::jsonb, '"a123"'::jsonb;
Keduanya mengandung string JSON .
Ini juga berfungsi:
SELECT '123'::jsonb;
.. tetapi berisi numerik JSON .
Tapi ini tidak berhasil:
SELECT 'a123'::jsonb; -- error
.. karena ini bukan literal numerik yang valid.
Manual ini memiliki tabel pemetaan antara JSON Primitive Type dan Corresponding PostgreSQL Type