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

ネストされたJSONBフィールド内のオブジェクトに対するPostgresqlクエリ

    JSON関数と演算子 に精通している必要があります 。

    -- #1
    select *
    from example
    where content->'Item'->>'Name' ilike '%dog%'
    and content->'Item'->>'Spec' ilike '%red%'
    
    -- #2
    select *
    from example
    where content->'Item'->>'Name' ilike '%dog%'
    or content->'Item'->>'Spec' ilike '%red%'
    
    -- #3
    select distinct on(no) t.*
    from example t,
    lateral jsonb_each_text(content->'Item')
    where value ilike '%dog%';
    
    -- and
    select *
    from example t
    order by length(content->'Item'->>'Name');
    

    Postgres 12 SQL/JSONパス言語を実装する新機能を紹介します。 jsonpathを使用した代替クエリ 次のようになります:

    -- #1
    select *
    from example
    where jsonb_path_exists(
        content, 
        '$ ? ($.Item.Name like_regex "dog" flag "i" && $.Item.Spec like_regex "red" flag "i")');
    
    -- #2
    select *
    from example
    where jsonb_path_exists(
        content, 
        '$ ? ($.Item.Name like_regex "dog" flag "i" || $.Item.Spec like_regex "red" flag "i")');
    
    -- #3
    select *
    from example
    where jsonb_path_exists(
        content, 
        '$.Item.* ? (@ like_regex "dog" flag "i")');
    

    最初の2つのクエリは、基本的に前のクエリと->に似ています。 構文はjsonpathよりも単純で快適に見えるかもしれません 1。ワイルドカードを使用する3番目のクエリには特に注意を払う必要があります。これにより、高価な関数jsonb_each_text ()を使用する必要がなくなります。 大幅に高速化する必要があります。

    ドキュメントを読む:




    1. Ms-AccessVBAクラスオブジェクト配列

    2. PubNub関数のガイド

    3. 指定されたIDの最新の行を取得します

    4. Postgresはサブクエリの結果を括弧で囲みます