PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zapytanie postgres jsonb według wartości niezależnie od kluczy

W przypadku prostych plików JSON możesz użyć bardziej odpowiednich zapytań, takich jak

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

Działa dobrze w przypadku JSON, jak w twoim przykładzie, ale nie pomaga w przypadku bardziej złożonych JSON, takich jak {"a":"hello","b":1,"c":{"c":"world"}}

Mogę zaproponować utworzenie zapisanej funkcji, takiej jak

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;

aby wyświetlić wszystkie wartości, w tym obiekty rekurencyjne (od Ciebie zależy, co zrobić z tablicami).

Oto przykład użycia:

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

Zwróć uwagę na podwójne cudzysłowy wokół wartości ciągu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja DATE ADD w PostgreSQL

  2. rake db:utwórz błąd kodowania za pomocą postgresql

  3. Ustawienie automatycznego zatwierdzania Postgres wyłączone globalnie

  4. PostgreSQL:eksport danych wynikowych z zapytania SQL do Excela/CSV

  5. Jak uzyskać listę funkcji w bazie danych w PostgreSQL wraz z jej parametrami?