Nilai json dapat terdiri dari nilai string. misalnya.:
postgres=# SELECT to_json('Some "text"'::TEXT);
to_json
-----------------
"Some \"text\""
Bagaimana saya bisa mengekstrak string itu sebagai nilai teks postgres?
::TEXT
tidak bekerja. Ini mengembalikan json yang dikutip, bukan string asli:
postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
to_json
-----------------
"Some \"text\""
Terima kasih.
PS Saya menggunakan PostgreSQL 9.3
json
postgresql
e79ene.dll
sumber
sumber
Jawaban:
Tidak ada cara di PostgreSQL untuk mendekonstruksi objek JSON skalar. Jadi, seperti yang Anda tunjukkan,
select length(to_json('Some "text"'::TEXT) ::TEXT);
adalah 15,
Caranya adalah dengan mengubah JSON menjadi array dari satu elemen JSON, kemudian mengekstrak elemen tersebut menggunakan
->>
.select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );
akan mengembalikan 11.
sumber
json_extract_path_text()
tidak bisa mereferensikan elemen root (AFAIK).from_json
diajukan, tetapi tidak diimplementasikan wiki.postgresql.org/wiki/JSON_API_BrainstormDi 9.4.4 menggunakan
#>>
operator berfungsi untuk saya:select to_json('test'::text) #>> '{}';
Untuk digunakan dengan kolom tabel:
select jsoncol #>> '{}' from mytable;
sumber
to_json(...)
itu hanyalah cara mudah untuk membuat nilai JSON untuk digunakan sebagai contoh dalam pernyataan satu baris singkat. Tentu Anda akan menggantinya dengan nama kolom JSON jika Anda membuat kueri tabel seperti yang Anda gambarkan. Selain itu, untuk menjernihkan titik kebingungan potensial, cast Anda(...)::text
berlebihan karena#>>
operator mengembalikan teks menurut definisi (dan merupakan alasan untuk menggunakan operator di tempat pertama). Anda bisa menyimpan tanda kurung tetapi melepaskan gips::text
.#>>
dan'{}'
sedang melakukan? Saya tidak bisa mengikuti ini dan tidak ada istilah yang ramah google. Jawaban ini memperbaiki masalah saya, saya hanya ingin tahu mengapa.#>>
operator ada di sini .text
. Ini mungkin terlihat seperti string tetapi ini adalah objek JSON. Untuk mengonversi objek itu dari JSON menjadi teks, gunakan#>>
operator. Tetapi operator itu membutuhkan Anda untuk menentukan jalur. Jalur ke objek root tersebut adalah{}
. JadiSELECT '"test"'::jsonb #>> '{}'
berarti "mendapatkan objek di jalur root dan mengubahnya menjadi teks".Tuan Curious juga ingin tahu tentang ini. Selain
#>> '{}'
operator, di 9.6+ seseorang bisa mendapatkan nilai string jsonb dengan->>
operator:select to_jsonb('Some "text"'::TEXT)->>0; ?column? ------------- Some "text" (1 row)
Jika salah satu memiliki nilai json, maka solusinya adalah memasukkan ke jsonb terlebih dahulu:
select to_json('Some "text"'::TEXT)::jsonb->>0; ?column? ------------- Some "text" (1 row)
sumber
Cara mudah untuk melakukan ini:
SELECT ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;
Cukup ubah string json menjadi daftar json
sumber
- >> bekerja untukku.
versi postgres:
Pertanyaan:
select object_details->'valuationDate' as asofJson, object_details->>'valuationDate' as asofText from MyJsonbTable;
Keluaran:
sumber
->
dan->>
saat menggunakan kunci. Lihat jawaban ini atau jawaban ini .