PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kueri postgres jsonb berdasarkan nilai terlepas dari kuncinya

Untuk JSON sederhana, Anda dapat menggunakan kueri yang lebih tepat seperti

select * 
from mytable t 
where exists (
  select 1 
  from jsonb_each_text(t.jsonbfield) j 
  where j.value = 'hello');

Ini berfungsi dengan baik untuk JSON seperti dalam contoh Anda tetapi tidak membantu untuk JSON yang lebih kompleks seperti {"a":"hello","b":1,"c":{"c":"world"}}

Saya dapat mengusulkan untuk membuat fungsi tersimpan seperti

create or replace function jsonb_enum_values(in jsonb) returns setof varchar as $$
begin
  case jsonb_typeof($1)
    when 'object' then
      return query select jsonb_enum_values(j.value) from jsonb_each($1) j;
    when 'array' then
      return query select jsonb_enum_values(a) from jsonb_array_elements($1) as a;
    else
      return next $1::varchar;
  end case;
end
$$ language plpgsql immutable;

untuk membuat daftar semua nilai termasuk objek rekursif (Terserah Anda apa yang harus dilakukan dengan array).

Berikut adalah contoh penggunaan:

with t(x) as (
  values
    ('{"a":"hello","b":"world","c":1,"d":{"e":"win","f":"amp"}}'::jsonb),
    ('{"a":"foo","b":"world","c":2}'),
    ('{"a":[{"b":"win"},{"c":"amp"},"hello"]}'),
    ('[{"a":"win"}]'),
    ('["win","amp"]'))
select * 
from t 
where exists (
  select *
  from jsonb_enum_values(t.x) j(x) 
  where j.x = '"win"');

Perhatikan bahwa tanda kutip ganda di sekitar nilai string.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara melakukan tes unit dengan database h2 di mana bpchar digunakan?

  2. Bagaimana cara membuat indeks unik dengan kondisional dan subquery di PostgreSQL?

  3. Cara menggunakan fungsi jendela SQL untuk menghitung persentase agregat

  4. Django:izin ditolak ketika mencoba mengakses basis data setelah pemulihan (migrasi)

  5. Kesalahan sintaksis PostgreSQL pada atau di dekat 'union'