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

オブジェクトJSONB内の配列から要素を削除する

    DELETE テーブルの行で機能します。したがって、行全体を削除する場合を除いて、使用することはできません。

    これを試してください:

    create temp table testing as
    select 
        '{ "playersContainer": {
            "players": [
                {
                    "id": "1",
                    "name": "Nick"
                },
                {
                    "id": "2",
                    "name": "Rick"
                },
                {
                    "id": "3",
                    "name": "Trick"
                }
            ]
         }}'::jsonb as value;
    

    次に、削除するプレーヤーの位置を見つける必要があります。たとえば、ID 2のリック(インデックスは0から始まるためマイナス1)が必要だとします。

    select position-1 from testing, jsonb_array_elements(value->'playersContainer'->'players') with ordinality arr(elem, position) WHERE elem->>'id' = '2';
    

    これをUPDATEと組み合わせることができます フィールドを更新するステートメント。マイナス(-)演算子を使用して、必要なインデックスの要素を削除します。

    UPDATE testing SET value = jsonb_set(value, '{playersContainer,players}', (value->'playersContainer'->'players') - (select position-1 from testing, jsonb_array_elements(value->'playersContainer'->'players') with ordinality arr(elem, position) WHERE elem->>'id' = '2')::int );
    

    最終結果:

    {
        "playersContainer":{
            "players":[
                {
                    "id":"1",
                    "name":"Nick"
                },
                {
                    "id":"3",
                    "name":"Trick"
                }
            ]
        }
    }
    



    1. 入れ子集合モデルのPHPライブラリ

    2. iOSSDK4.2を使用したlibpqのコンパイル

    3. データベースと同期されたMemcachedを実装する方法

    4. クエリのようにKnexで%をエスケープするにはどうすればよいですか?