Asumsikan tabel json_table dengan kolom data (jsonb). Sebuah nilai sampel akan menjadi

{"a": [{"b":{"c": "xxx", "d": 1}},{"b":{"c": "xxx", "d": 2}}]}

Saya biasa menjalankan kueri SQL seperti berikut:

SELECT data
FROM json_table j
WHERE NOT EXISTS (SELECT 1
                  FROM jsonb_array_elements(j.data#>'{a}') dt 
                  WHERE (dt#>>'{b,d}')::integer IN (2, 4, 6, 9)
                 );

Masalahnya sekarang properti d harus memiliki tipe ganda, baik integer atau string. Ini berarti bahwa kueri yang disebutkan di atas akan macet dengan

ERROR: invalid input syntax for integer: "d-string-value"

Saya ingin menghindari solusi yang jelas untuk membuat dua properti d_id dan d_name.

Jadi, apakah ada cara untuk menanyakan properti JSONB tipe ganda?

2
Georgios Varisteas 8 Maret 2020, 11:09

1 menjawab

Jawaban Terbaik

Bagaimana kalau casting ke teks saja?

WHERE (dt#>>'{b,d}')::text IN ('2', '4', '6', '9')
1
GMB 8 Maret 2020, 09:15