【问题标题】:postgresql rename multiple substrings in a json string with one querypostgresql用一个查询重命名json字符串中的多个子字符串
【发布时间】:2018-12-07 11:22:28
【问题描述】:

我想保存更新请求。所以不要这样做:

update table set column = REPLACE(column,'abc','xyz');
update table set column = REPLACE(column,'def','uvw');
...

我想做这样的事情:

UPDATE table
SET column =
CASE
    WHEN column like '%"abc":%' THEN REPLACE(column,'"abc":','"xyz":')
    WHEN column like '%"def":%' THEN REPLACE(column,'"def":','"uvw":')
    ...
END
WHERE COLUMN2 = 'something';

但这并不是我需要的那种循环。它只替换它找到的第一个匹配项。

我知道我也可以这样做:

update table
set column = REPLACE(REPLACE(column,'abc','xyz'),'def','uvw')
where COLUMN = 'something';

但我不知道他们每个人的表现。

【问题讨论】:

  • 嵌套替换语句看起来是解决您的问题恕我直言的好方法。
  • 关于您对 CASE 的陈述,column 是否/可以同时包含“abc”和“def”?如果是这样,那么带有多个 REPLACE 命令的语句就是要走的路。
  • json 字符串包含“abc”和“def”。但是使用嵌套替换和大约 10 个字符串,它看起来很混乱。我认为我可以做得更好。
  • 那么 CASE 语句不能正常工作的原因是因为只有一个 CASE 路径会被执行;如果column like '%"abc":%' 那么它将执行第一次替换,这将是该字段的 CASE 语句评估的结束,它不会继续检查它是否包含“def”等。

标签: string postgresql performance replace


【解决方案1】:

您可以为嵌套替换尝试不同的格式:

update table
set column =    REPLACE(
                REPLACE(
                REPLACE(
                REPLACE(column, 'abc','xyz'),
                                'def','uvw'),
                                'zxc','acv'),
                                'xcv','bvn')
where COLUMN = 'something';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 2017-09-19
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多