Postgres 更新 jsonb 字段
Postgres update jsonb fields
我有一个 table "profile" 和一个名为 "payment_methods" 的 jsonb
字段。
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,我想将其设置为主。
我该怎么做?
不完全确定这个table的结构,但我想到了这个。
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
作为它们自己的列?
我有一个 table "profile" 和一个名为 "payment_methods" 的 jsonb
字段。
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,我想将其设置为主。
我该怎么做?
不完全确定这个table的结构,但我想到了这个。
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
作为它们自己的列?