sql >> データベース >  >> RDS >> PostgreSQL

キーに関係なく、値でpostgresjsonbをクエリします

    単純なJSONの場合、

    のようなより適切なクエリを使用できます。
    select * 
    from mytable t 
    where exists (
      select 1 
      from jsonb_each_text(t.jsonbfield) j 
      where j.value = 'hello');
    

    あなたの例のようなJSONには問題なく機能しますが、 {"a": "hello"、 "b":1、 "c":{"c":"world"}}<のようなより複雑なJSONには役立ちません。 / code>

    のようなストアド関数の作成を提案できます
    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. MySQL:FROM句で更新のターゲットテーブルを指定することはできません

    2. 外部phpファイルJoomlaにJfactoryクラスを含める

    3. varcharとnvarcharの違いは何ですか?

    4. Rを使用してpostgresでスキーマ名を設定する