Postgres обновить поля JSONB - PullRequest
       8

Postgres обновить поля JSONB

0 голосов
/ 07 февраля 2019

У меня есть таблица "профиль" с полем jsonb, которое называется "payment_methods".Структура поля jsonb выглядит следующим образом:

[{"name": "paypal", "primary": false}, 
 {"name": "braintree", "primary": true}, 
 {"name": "skrill", "primary": false}]

Я хочу сделать запрос, чтобы динамически установить основной метод оплаты на метод, который выберет пользователь.Если пользователь выбирает метод PayPal в качестве основного, я хочу установить поле jsonb следующим образом:

[{"name": "paypal", "primary": true}, 
 {"name": "braintree", "primary": false}, 
 {"name": "skrill", "primary": false}]

Итак, я хочу обновить первичное поле PayPal в true и первичное поле любого другого метода оплатыв false.

Примечание. Я хочу выполнить фильтрацию по полю имени.Поэтому, если пользователь дал мне, например, PayPal, я хочу установить его в качестве основного.

Как я могу это сделать?

1 Ответ

0 голосов
/ 08 февраля 2019

Не совсем уверен в структуре этой таблицы, но я придумал это.

CREATE OR REPLACE FUNCTION func_updatePrimaryPaymentMethod(userid integer, pay_method_name text)
RETURNS SETOF profile
AS $$
DECLARE
    rec record;
BEGIN
    SELECT * INTO rec FROM profile WHERE id = userid;

    FOR i IN array_lower(rec.payment_methods, 1) .. array_upper(rec.payment_methods, 1)
    LOOP
        IF rec.payment_methods[i]->>'name' = pay_method_name
        THEN
            rec.payment_methods[i] := rec.payment_methods[i] || jsonb_build_object('primary', TRUE);
        ELSE
            rec.payment_methods[i] := rec.payment_methods[i] || jsonb_build_object('primary', FALSE);
        END IF;
    END LOOP;
    RETURN NEXT rec;
END;
$$  LANGUAGE PLPGSQL;

Если это решение, я бы порекомендовал изменить этот дизайн, если у вас есть возможность, так как это всегда будетс ним тяжело работать.Вы не должны хранить несколько объектов jsonb в одном поле.

Почему бы просто не иметь name и primary в качестве собственных столбцов?

...