PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truy vấn postgres jsonb theo giá trị bất kể khóa

Đối với các JSON đơn giản, bạn có thể sử dụng truy vấn thích hợp hơn như

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

Nó hoạt động tốt với các JSON như trong ví dụ của bạn nhưng không hiệu quả với các JSON phức tạp hơn như {"a":"hello","b":1,"c":{"c":"world"}}

Tôi có thể đề xuất tạo hàm được lưu trữ như

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;

để liệt kê tất cả các giá trị bao gồm các đối tượng đệ quy (Bạn phải làm gì với mảng).

Đây là ví dụ sử dụng:

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"');

Lưu ý rằng dấu ngoặc kép xung quanh giá trị chuỗi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. http:// localhost / phppgadmin / -> 403 Bị cấm

  2. Có thể sử dụng pandas / sqlalchemy để chèn mảng vào cơ sở dữ liệu sql không? (postgres)

  3. Làm cách nào để đính kèm cơ sở dữ liệu vào một ứng dụng trong Heroku?

  4. PL / Perl gửi thư trong Postgresql

  5. c ++ chuyển đổi dấu thời gian postgres không có múi giờ thành time_t