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

PostgreSQL JSONBデータ型内の単一のプロパティ値を変更するにはどうすればよいですか?

    jsonb_set()の3番目の引数 jsonbである必要があります タイプ。問題は、テキスト文字列をjsonb文字列にキャストすることです。二重引用符で囲まれた文字列が必要です。 concat()を使用できます またはformat()

    update animal
    set info = 
        jsonb_set(info, '{location}', concat('"', lower(info->>'location'), '"')::jsonb, true) 
    --  jsonb_set(info, '{location}', format('"%s"', lower(info->>'location'))::jsonb, true) 
    where id='49493'
    returning *;
    
      id   |                               info                               
    -------+------------------------------------------------------------------
     49493 | {"habit1": "fly", "habit2": "dive", "location": "sonoma narite"}
    (1 row)
    

    Postgres 9.4 jsonb_each_text()を使用してjson列をアンネストし、キーと値をその場で適切な値に変更して集約し、最後にjsonオブジェクトを構築する必要があります。

    update animal a
    set info = u.info
    from (
        select id, json_object(
            array_agg(key), 
            array_agg(
                case key when 'location' then lower(value)
                else value end))::jsonb as info
        from animal,
        lateral jsonb_each_text(info) 
        group by 1
        ) u
    where u.id = a.id
    and a.id = 49493;
    

    関数を作成できれば、このソリューションの方が快適かもしれません:

    create or replace function update_info(info jsonb)
    returns jsonb language sql as $$
        select json_object(
            array_agg(key), 
            array_agg(
                case key when 'location' then lower(value)
                else value end))::jsonb
        from jsonb_each_text(info)
    $$
    
    update animal
    set info = update_info(info)
    where id = 49493;
    


    1. PL/SQL-IN句で配列を使用する方法

    2. ファイルからテキストを取得し、スクリプトを使用してmysqlテーブルに挿入します

    3. さまざまなユーザータイプの複数の電子メールアドレスをデータベースに保存する

    4. SQLServerでデータセットをより適切に複製する方法