我正在尝试替换在 Postgres DB 中保存为 VARCHAR 的 JSON 中的一些内容。我为此使用 REGEX_REPLACE
函数。但是,在某些情况下,它会忽略我的大括号并生成无效的 JSON。
CREATE TABLE expressions (
id BIGINT,
expression VARCHAR(512)
);
INSERT INTO expressions VALUES
(1, '{params:[{"value":"test"}]}'),
(1, '{params:[{"value":"test1"},{"value":"test2"}]}');
UPDATE expressions SET "expression" = REGEXP_REPLACE("expression",
'"value":"(.*)"','"value":{"value": "\1"}', 'g')
WHERE true;
SELECT * FROM expressions;
第一行生成正确的 JSON,但第二行缺少一个右大括号并生成以下内容:{params:[{"value":{"value": "test1"},{"value": “test2”}}]}
。
有人知道我的表情出了什么问题吗?
编辑:我正在尝试替换以下内容: {"param": [{"value":"x"}]}
-> {"param": [{"值":{值:"x"}}]}
基本上,将 value
字符串嵌套到具有相同结构的嵌套 json 中。这需要适用于列中的多个值,因此 {params:[{"value":"test1"},{"value":"test2"}]}
应生成 {params :[{"value":{"value":"test1"}},{"value":{"value":"test2"}}]}
最佳答案
请记住,默认情况下 .*
会贪婪地匹配 - 因此在第二种情况下,您的第二个匹配将是整个字符串直到最后一个 "
字符。 Try
UPDATE expressions SET "expression" = REGEXP_REPLACE("expression",
'"value":"(.*?)"','"value":{"value": "\1"}', 'g')
问号将使匹配变得“惰性”,因此在遇到第一个 "
后它将停止尝试匹配。g
标志仍将确保两个匹配被发现了。
关于sql - 使用正则表达式替换部分 json(另存为 varchar),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71873705/