【问题标题】:In postgres updating a jsonb column, how do you create OR append an array in one query?在更新 jsonb 列的 postgres 中,如何在一个查询中创建或追加数组?
【发布时间】:2023-02-24 03:55:47
【问题描述】:

我有一个包含一些基本 jsonb 的表,对于这个例子,我们称之为交易

CREATE TABLE transactions (
    transaction_id text NOT NULL,
    body jsonb,
);

所以在体内我有一些我们可以忽略的数据,但它是一个类似的对象 {“价格”:10}等

我想添加一个退款键,并将其默认为一个空数组,或者在一个查询中将其推入数组。

以下在两个查询中完成它:

UPDATE transactions 
SET body = jsonb_set(body, '{refunds}', '[]'::jsonb, true) 
WHERE transaction_id = 'abc'
UPDATE transactions 
SET body = jsonb_insert(body, '{refunds,0}', '{"id":"any"}'::jsonb, true) 
WHERE transaction_id = 'abc'

但如果数组不存在于单个事务/查询中,我似乎无法实例化该数组。当然也尝试了 postgres jsonb 文档。

提前致谢!

【问题讨论】:

    标签: postgresql sql-update jsonb pg


    【解决方案1】:

    但是,如果在创建表时将默认键“refunds”设置为空列表怎么办?

    CREATE TABLE transactions (
        transaction_id text NOT NULL,
        body jsonb NOT NULL DEFAULT '{"refunds":[]}'::jsonb
    );
    

    记录“transaction_id”。

    INSERT INTO "transactions" ("transaction_id") VALUES ('abc');
    

    输出

     transaction_id |      body
    ----------------+-----------------
     abc            | {"refunds": []}
    

    更新

    UPDATE transactions 
    SET body = jsonb_set(body, '{refunds}', '[{"id":"any"}]'::jsonb, true)
    WHERE transaction_id = 'abc';
    

    【讨论】:

    • TY 的建议,但正文 json 实际上是从 API 的事务响应中存储的。我有这些已经存在的存储,所以从头开始表不是一个选项。必须有一些 jsonb 方法来做到这一点!
    • @mdubbpro 如果我理解正确,您是否需要在一次更新中使用空列表创建退款,或者使用列表中的值设置退款?如果是这样,则更新代码,示例在哪里。
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2017-03-10
    • 2018-02-13
    • 1970-01-01
    • 2015-11-28
    • 2020-10-31
    相关资源
    最近更新 更多