更新 jsonb 列中的 bool 值 - jsonb_set
Update bool value in a jsonb column - jsonb_set
以下面的json为例:
{
"red": false,
"blue": false,
"yellow": false
}
我必须将其中一个元素更新为 true,预期结果是:
{
"red": false,
"blue": false,
"yellow": true
}
首先,我试着这样更新:
UPDATE table_name
SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', ('"true"')::jsonb, true)
但结果是
{
"red": false,
"blue": false,
"yellow": "true"
}
不是我想要的,它是一个字符串,而不是布尔值
也尝试过:
UPDATE table_name
SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', true, true)
但是我得到一个错误,这是有道理的,第三个参数必须是 jsonb
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 因为 bool 无法转换为 jsonb:
SQL Error [42846]: ERROR: cannot cast type boolean to jsonb
还有其他方法吗?不需要使用 jsonb_set,我想我可以使用 str_replace 然后转换为 jsonb 但我不知道它是否安全
感谢爱德华的回答,我意识到我没有测试所有明显的可能性。
'true'::jsonb
仅用单引号就可以了
UPDATE table_name
SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', 'true'::jsonb, true)
对于此示例,您不需要 jsonb_set
。由于这是一个 jsonb
列,您可以简单地附加新值,现有的 key/value 对将被替换为新值。
update table_name
set jsonb_column_name = jsonb_column_name || '{"yellow": true}';
以下面的json为例:
{
"red": false,
"blue": false,
"yellow": false
}
我必须将其中一个元素更新为 true,预期结果是:
{
"red": false,
"blue": false,
"yellow": true
}
首先,我试着这样更新:
UPDATE table_name
SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', ('"true"')::jsonb, true)
但结果是
{
"red": false,
"blue": false,
"yellow": "true"
}
不是我想要的,它是一个字符串,而不是布尔值
也尝试过:
UPDATE table_name
SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', true, true)
但是我得到一个错误,这是有道理的,第三个参数必须是 jsonb
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 因为 bool 无法转换为 jsonb:
SQL Error [42846]: ERROR: cannot cast type boolean to jsonb
还有其他方法吗?不需要使用 jsonb_set,我想我可以使用 str_replace 然后转换为 jsonb 但我不知道它是否安全
感谢爱德华的回答,我意识到我没有测试所有明显的可能性。
'true'::jsonb
仅用单引号就可以了
UPDATE table_name
SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', 'true'::jsonb, true)
对于此示例,您不需要 jsonb_set
。由于这是一个 jsonb
列,您可以简单地附加新值,现有的 key/value 对将被替换为新值。
update table_name
set jsonb_column_name = jsonb_column_name || '{"yellow": true}';