如何在 pgAdmin 中用替换值更新 jsonb 列?
How to update a jsonb column with a replaced value in pgAdmin?
我有一个名为 files
的 PostgreSQL table,其中包含一个名为 formats
的 jsonb table。虽然有些行是 [null]
,但其他行的对象具有以下结构:
{
"thumbnail": {
"ext": ".jpg",
"url": "https://some-url.com/image01.jpg",
"name": "image01.jpg",
//...other properties
}
}
对于每一行,我想更新 thumbnail.url
并将 some-url
替换为 other-url
。
我远不是 PostgreSQL(或与此相关的任何其他数据库)方面的专家,在阅读了一些文章之后,我尝试 运行 在 pgAdmin 中执行以下查询:
UPDATE files
SET formats = jsonb_set(formats, '{thumbnail.url}', REPLACE('{thumbnail.url}', 'some-url', 'other-url'))
我收到了这个错误:function jsonb_set(jsonb, unknown, text) does not exist
我试图设置格式 jsonb_set(formats::jsonb...)
,试图将目标 '{thumbnail}'
而不是 '{thumbnail.url}'
- 总是同样的错误。
我做错了什么?还是 pgAdmin 真的不支持这个功能?如何使用 pgAdmin 查询工具进行此类更新?
我们可以尝试使用 ->>
来获取 url
的 JSON 内容值,然后从中替换您的期望值。
因为您的 JSON 的 url
字段可能是字符串类型,我们需要在转换为 JSONB
之前使用 "
来满足它
jsonb_set(target jsonb, path text[], new_value jsonb [, create_missing boolean])
UPDATE files
SET formats = jsonb_set(formats, '{thumbnail,url}', CONCAT('"',REPLACE(formats->'thumbnail'->>'url','some-url','other-url'),'"')::JSONB);
jsonb_set()
的第二个参数必须是一个数组,每个“路径”元素都有一个数组元素。所以第二个参数应该是'{thumbnail,url}'
或者更明显的:array['thumbnail', 'url']
而第三个参数必须是一个jsonb
值,但是replace
returns一个text
,所以你需要使用例如to_jsonb()
将 replace()
的结果转换为 jsonb 值。
正如 D-Shih 指出的那样,您需要使用 ->>
提取旧值。但是要获得 URL 你需要“导航”到它:formats -> 'thumbnail ->> 'url'
我还要添加一个 WHERE 子句,以便您只更新实际包含 URL.
的行
UPDATE files
SET formats = jsonb_set(formats,
'{thumbnail,url}',
to_jsonb(replace(formats -> 'thumbnail' ->> 'url', 'some-url', 'other-url'))
)
where (formats -> 'thumbnail') ? 'url'
我有一个名为 files
的 PostgreSQL table,其中包含一个名为 formats
的 jsonb table。虽然有些行是 [null]
,但其他行的对象具有以下结构:
{
"thumbnail": {
"ext": ".jpg",
"url": "https://some-url.com/image01.jpg",
"name": "image01.jpg",
//...other properties
}
}
对于每一行,我想更新 thumbnail.url
并将 some-url
替换为 other-url
。
我远不是 PostgreSQL(或与此相关的任何其他数据库)方面的专家,在阅读了一些文章之后,我尝试 运行 在 pgAdmin 中执行以下查询:
UPDATE files
SET formats = jsonb_set(formats, '{thumbnail.url}', REPLACE('{thumbnail.url}', 'some-url', 'other-url'))
我收到了这个错误:function jsonb_set(jsonb, unknown, text) does not exist
我试图设置格式 jsonb_set(formats::jsonb...)
,试图将目标 '{thumbnail}'
而不是 '{thumbnail.url}'
- 总是同样的错误。
我做错了什么?还是 pgAdmin 真的不支持这个功能?如何使用 pgAdmin 查询工具进行此类更新?
我们可以尝试使用 ->>
来获取 url
的 JSON 内容值,然后从中替换您的期望值。
因为您的 JSON 的 url
字段可能是字符串类型,我们需要在转换为 JSONB
"
来满足它
jsonb_set(target jsonb, path text[], new_value jsonb [, create_missing boolean])
UPDATE files
SET formats = jsonb_set(formats, '{thumbnail,url}', CONCAT('"',REPLACE(formats->'thumbnail'->>'url','some-url','other-url'),'"')::JSONB);
jsonb_set()
的第二个参数必须是一个数组,每个“路径”元素都有一个数组元素。所以第二个参数应该是'{thumbnail,url}'
或者更明显的:array['thumbnail', 'url']
而第三个参数必须是一个jsonb
值,但是replace
returns一个text
,所以你需要使用例如to_jsonb()
将 replace()
的结果转换为 jsonb 值。
正如 D-Shih 指出的那样,您需要使用 ->>
提取旧值。但是要获得 URL 你需要“导航”到它:formats -> 'thumbnail ->> 'url'
我还要添加一个 WHERE 子句,以便您只更新实际包含 URL.
的行UPDATE files
SET formats = jsonb_set(formats,
'{thumbnail,url}',
to_jsonb(replace(formats -> 'thumbnail' ->> 'url', 'some-url', 'other-url'))
)
where (formats -> 'thumbnail') ? 'url'