首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新jsonb列中的布尔值- jsonb_set

更新jsonb列中的布尔值- jsonb_set
EN

Stack Overflow用户
提问于 2021-10-28 16:18:42
回答 2查看 215关注 0票数 0

下面是json示例:

代码语言:javascript
复制
{
  "red": false,
  "blue": false,
  "yellow": false
}

我必须将其中一个元素更新为true,预期结果为:

代码语言:javascript
复制
{
  "red": false,
  "blue": false,
  "yellow": true
}

首先,我尝试这样更新:

代码语言:javascript
复制
UPDATE table_name
   SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', ('"true"')::jsonb, true) 

但结果是

代码语言:javascript
复制
{
  "red": false,
  "blue": false,
  "yellow": "true"
}

不是我想要的,它是一个字符串,而不是布尔值

还尝试了:

代码语言:javascript
复制
UPDATE table_name
   SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', true, true)

但是我得到了一个错误,这是有道理的,第三个参数必须是jsonb

代码语言:javascript
复制
SQL Error [42883]: ERROR: function jsonb_set(jsonb, unknown, boolean, boolean) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.

我不能将true::jsonb转换为true::jsonb,因为bool不能转换为jsonb:

代码语言:javascript
复制
SQL Error [42846]: ERROR: cannot cast type boolean to jsonb

还有其他方法可以做到这一点吗?不需要使用jsonb_set,我想我可以使用str_replace然后转换成jsonb,但是我不知道它是否安全

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-29 15:19:39

在本例中,您不需要jsonb_set。由于这是一个jsonb列,您可以简单地附加新值,现有的键/值对将被新的键/值对替换。

代码语言:javascript
复制
update table_name
   set jsonb_column_name = jsonb_column_name || '{"yellow": true}';
票数 0
EN

Stack Overflow用户

发布于 2021-10-29 15:12:37

多亏了爱德华的回答,我意识到我还没有测试所有显而易见的可能性。

仅使用单引号的'true'::jsonb有效

代码语言:javascript
复制
UPDATE table_name
   SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', 'true'::jsonb, true)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69757640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档