【问题标题】:Replace a string with another string from a list depending on the value根据值将字符串替换为列表中的另一个字符串
【发布时间】:2015-06-27 23:27:30
【问题描述】:

假设我有这个字符串:'2015/4/21 (Tuesday)'。我想用另一个字符串替换 'Tuesday',例如:'cat'。结果应该是:'2015/4/21 (cat)'

但我也希望它是动态的,如果是“星期二”,那么是“猫”。如果是“星期一”,那么就是狗等等。

如何在 PostgreSQL 8.4 中执行此操作?

有一个类似的帖子:postgresql - replace all instances of a string within text field

但我的需要根据日期替换一些动态的内容,并且该帖子会替换一个已知值。

【问题讨论】:

标签: postgresql replace postgresql-8.4


【解决方案1】:

对于几个互斥替换,嵌套替换语句是最简单和最快的方法。只需like @Gordon suggests

但这对于多个替代品来说并不能很好地扩展,并且存在陷阱

子字符串

当字符串可以是彼此的子字符串时,它变得不明确。考虑这两个表达式:

SELECT replace((replace('2015 (Monday)', 'day', 'snake'), 'Monday', 'dog')
     , replace((replace('2015 (Monday)', 'Monday', 'dog'), 'day', 'snake');

结果取决于替换的顺序。你必须定义优先级。通常,您会先替换较长的字符串。

那么也有可能一个替换可能会为下一个替换创建匹配:

SELECT replace((replace('2015 (Sunday)', 'Sun', 'Mon'), 'Monday', 'dog')
     , replace((replace('2015 (Sunday)', 'Monday', 'dog'), 'Sun', 'Mon');

同样,您必须定义优先级。
每一次更换都可能影响下一次。有了不止几个替换,这很快就会变得模糊和容易出错。如果更换可以更换,也很难维护。

正如我所说,只有一周中的几天,嵌套的 replace() 语句就可以了。这实际上不是“动态的”。如果工作日只是为了说明问题而您实际上必须处理更多案例或真正动态的字符串,我会考虑另一种方法。在这个相关答案中找到完全动态解决方案

【讨论】:

  • 谢谢!我继续使用嵌套替换。 :)
  • 你能通过在标记周围使用分隔符来消除这些问题吗?如果初始输入字符串是查询的结果,则连接 SELECT 中的分隔符?
  • @grantwparks:不确定我是否理解。请将您的问题作为新问题提出。您可以随时链接到这个以获取上下文。
【解决方案2】:

另一种选择是递归函数:

CREATE OR REPLACE FUNCTION replace_recursive(search text, from_to text[][])
RETURNS TEXT LANGUAGE plpgsql AS $$
BEGIN
    IF (array_length(from_to,1) > 1) THEN
        RETURN replace_recursive(
            replace(search, from_to[1][1], from_to[1][2]),
            from_to[2:array_upper(from_to,1)]
        );
    ELSE
        RETURN replace(search, from_to[1][1], from_to[1][2]);
    END IF;
END;$$;

结果:

select replace_recursive('from1, from2, from3', array[['from1', 'to1'], ['from2', 'to2']]);

┌───────────────────┐
│ replace_recursive │
├───────────────────┤
│ to1, to2, from3   │
└───────────────────┘

【讨论】:

    【解决方案3】:

    您应该可以使用嵌套的replace()

    select replace(replace(str, 'Tuesday', 'cat'), 'Monday', 'dog')
    

    如果值不在字符串中,则什么都不会发生。

    【讨论】:

    • 是否可以使用正则表达式类型的替换?谢谢!
    • @Kevin 。 . .可能,但似乎不需要。
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多