sql - 使用正则表达式替换部分 json(另存为 varchar)

标签 sql postgresql

我正在尝试替换在 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/

相关文章:

php - IF 语句、IF 函数还是 CASE?

sql - 如何修剪 PostgreSQL 数据库中所有表中每一列的尾随空格

postgresql - 在每第 n 个字符后拆分字符串

ruby-on-rails - 为什么我的 Rails 应用程序在控制台启动时忽略环境变量 DATABASE_URL?

sql - 在 SQL 中向表中添加列时得到公式的错误答案

java - 如何创建可选的外键引用?

php - 插入值时 mysqli_real_escape 看起来不正确

mysql - 如何在 MySQL(或任何其他 SQL)中存储和计算动态表达式

Mysql 返回 1 如果找到或根本不存在值,如果存在其他值,返回 0

sql - 完整性检查 : count(*) vs count(pkColumn)