Postgres обновить поля JSONB
У меня есть таблица "профиль" с 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 ответ
Не совсем уверен в структуре этой таблицы, но я придумал это.
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
как свои колонки?