Bagaimana cara mengubah sql-text menjadi jsonb-string?

Nov 23 2020

Sepertinya tidak ada cara yang jelas:

  • select 'a123'::text::jsonb= ERROR: sintaks input tidak valid untuk tipe json
  • select '"a123"'::text::jsonb= BAD string karena
    cek dikutip select '"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

1 ErwinBrandstetter Nov 23 2020 at 20:10

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