PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres/JSON - zaktualizuj wszystkie elementy tablicy

Nie ma standardowej funkcji do aktualizacji elementów tablicy json według klucza. Funkcja niestandardowa jest prawdopodobnie najprostszym sposobem rozwiązania problemu:

create or replace function update_array_elements(arr jsonb, key text, value jsonb)
returns jsonb language sql as $$
    select jsonb_agg(jsonb_build_object(k, case when k <> key then v else value end))
    from jsonb_array_elements(arr) e(e), 
    lateral jsonb_each(e) p(k, v)
$$;

select update_array_elements('[{"bar":true},{"bar":true}]'::jsonb, 'bar', 'false');

      update_array_elements
----------------------------------
 [{"bar": false}, {"bar": false}]
(1 row)

Twoje zapytanie może wyglądać tak:

with a_data(js) as (
values(
    '{
        "foo": [
          {
            "bar": true
          },
          {
            "bar": true
          }
        ]
    }'::jsonb)
)
select
    jsonb_set(js, '{foo}', update_array_elements(js->'foo', 'bar', 'false'))
    from a_data;

                 jsonb_set                 
-------------------------------------------
 {"foo": [{"bar": false}, {"bar": false}]}
(1 row)     


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przywróć zrzut na zdalnym komputerze

  2. Aby zignorować zduplikowane klucze podczas „kopiowania z” w postgresql

  3. Wiele wywołań array_agg() w jednym zapytaniu

  4. postgres:uaktualnić użytkownika do superużytkownika?

  5. leniwe zapytanie clojure.java.jdbc