PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Заявка postgres jsonb по стойност, независимо от ключовете

За прости JSON можете да използвате по-подходяща заявка като

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

Работи добре за JSON като във вашия пример, но не помага за по-сложни JSON като {"a":"hello","b":1,"c":{"c":"world"}}

Мога да предложа да се създаде съхранената функция като

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;

за изброяване на всички стойности, включително рекурсивни обекти (Вие решавате какво да правите с масивите).

Ето пример за употреба:

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

Имайте предвид, че двойните кавички около стойността на низа.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO не хвърля изключение с необвързани параметри (и без променливи в заявката)

  2. Временна таблица за дъмп на PostgreSQL

  3. Стойност по подразбиране в колона при вмъкване на нов ред

  4. PostgreSQL:Групиране и филтриране на таблица с условие за несъществуване

  5. Как да направите заявка без значение за главни букви в Postgresql?