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

JSONタイプ内の配列要素のクエリ

    jsonb Postgres9.4以降

    できます jsonb_array_elements()を使用して、以下と同じクエリを使用します 。

    ただし、 jsonbを使用してください 「含む」演算子@>data->'objects'の一致するGINインデックスと組み合わせて :

    CREATE INDEX reports_data_gin_idx ON reports
    USING gin ((data->'objects') jsonb_path_ops);
    
    SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';
    

    キーオブジェクト以降 JSON配列を保持します 、検索語の構造を一致させ、配列要素も角かっこで囲む必要があります。プレーンレコードを検索するときは、配列ブラケットを削除してください。

    その他の説明とオプション:

    • JSON配列内の要素を検索するためのインデックス

    json Postgres9.3以降

    関数json_array_elements()を使用してJSON配列をネスト解除します FROMの横方向の結合 節とその要素のテスト:

    SELECT data::text, obj
    FROM   reports r, json_array_elements(r.data#>'{objects}') obj
    WHERE  obj->>'src' = 'foo.png';

    db<>ここでフィドル
    古いsqlfiddle

    または、シングルだけに相当します ネストのレベル:

    SELECT *
    FROM   reports r, json_array_elements(r.data->'objects') obj
    WHERE  obj->>'src' = 'foo.png';

    ->>-> および#> オペレーターはマニュアルで説明されています。

    どちらのクエリも暗黙のJOINLATERALを使用します 。

    密接に関連している:

    • JSON列の配列要素のクエリ


    1. アダプティブサーバーが使用できないか、PHPからSQLServerへの接続中にエラーが発生しません

    2. SQL Server(T-SQL)のパスワードが間違っているためにログインに失敗した回数を取得する

    3. PostgreSQLのLISTAGG(Oracleデータベース)に相当するものは何ですか?

    4. SQL Serverで連結文字列にセパレータを追加する方法– CONCAT_WS()