【问题标题】:Update key value in jsonb array of objects更新 jsonb 对象数组中的键值
【发布时间】:2018-11-15 13:48:17
【问题描述】:

我有下表company,其中有一个名为jsonb 的列log:-

|code | log
-----------------------------------------------------------------------------
|K50  | [{"date": "2002-02-06", "type": "Chg Name", "oldvalue": "TEH   "},
         {"date": "2003-08-26", "type": "Chg Name", "oldvalue": "TEOA   "}]
|C44  | [{"date": "2003-05-07", "type": "Chg Name", "oldvalue": "CDE   "}]

如何修剪oldvalue中的尾随空格?

【问题讨论】:

    标签: arrays postgresql jsonb postgresql-9.6


    【解决方案1】:

    你可以用jsonb functions and operators的组合来做到这一点:

    UPDATE company c
    SET    log = sub.log2
    FROM  (
       SELECT *
       FROM   company c
       CROSS  JOIN LATERAL (
          SELECT jsonb_agg(jsonb_set(l, '{oldvalue}', to_jsonb(rtrim(l->>'oldvalue')))) AS log2
          FROM   jsonb_array_elements(c.log) l
          ) sub
       WHERE  jsonb_typeof(log) = 'array'  -- exclude NULL and non-arrays
       ) sub
    WHERE  c.code =  sub.code   -- assuming code is unique
    AND    c.log  <> sub.log2;  -- only where column actually changed.
    

    SQL Fiddle.

    【讨论】:

    • 感谢您的帮助。不得不将最后一行更改为 sub.log2 sub.log 虽然
    • 是的,c.log &lt;&gt; sub.log2,已修复。
    【解决方案2】:

    在 postgreSQL 中,jsonb 数据类型用于存储接收到的 json。如果要更新其中的任何值,则需要先从代码中转换数据,然后才能将其存储在 DB 中。这很好练习。在这种情况下,应注意代码本身的尾随空格。如果您想显式更新,那也是可能的。

    PFB 链接。

    How to perform update operations on columns of type JSONB in Postgres 9.4

    【讨论】:

    • 感谢您的指点。同意。这是原始导入脚本中的一个疏忽,此后已被修补。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多