【问题标题】:Alter single value in json string in text field在文本字段中更改 json 字符串中的单个值
【发布时间】:2021-04-14 09:14:18
【问题描述】:

我有一个表,其中包含一个文本类型的列,其中包含一个 json 字符串。我想做一个查询,在其中选择一堆行(大约 50 行),并为这些行更新保存在文本字段中的 json 中的单个值。所以可以说它目前看起来像这样

{"amount":"45","level":1}

我想更新每一行的金额值,例如“级别”* 5。

我想不出用一个查询来做到这一点的方法,因为似乎不可能改变这样的文本类型字段的单个值。还是我错过了什么?否则我将不得不为我需要更改的每一行手动更改它,这会很痛苦。

【问题讨论】:

  • 先看看能不能像这样把文本转换成jsonb:select mycol::jsonb from mytable

标签: sql json postgresql


【解决方案1】:

您需要先将值转换为正确的jsonb 值,然后您可以使用JSON functions 对其进行操作。

update the_table
   set the_column = jsonb_set(the_column::jsonb, '{level}', to_jsonb((the_column::jsonb ->> 'level')::int * 5))::text
where ....

表达式(the_column::jsonb ->> 'level')::int * 5 提取level 的当前值,将其转换为整数并乘以5。它周围的to_jsonb() 是必要的,因为jsonb_set() 需要一个jsonb 值作为最后一个参数

'{level}' 参数告诉jsonb_set() 将新值(见上文)放入(顶级)键level

最后将整个 jsonb 值转换回 text 值。


如果您确实将 JSON 存储在该列中,您应该考虑将该列转换为 jsonb 数据类型以避免所有来回转换。

或者也许考虑一个适当的标准化模型,这就像set level = level * 5 一样简单

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多