簡體   English   中英

Postgres更新JSONB字段

[英]Postgres update jsonb fields

我有一個表“ 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。

注意:我想使用名稱字段進行過濾。 因此,如果用戶給我例如貝寶,我想將其設置為主。

我怎樣才能做到這一點?

不能完全確定此表的結構,但我想出了這一點。

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對象。

為什么不只將nameprimary列作為自己的列?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM