根据值将列表替换为列表中的另一个字符串

时间:2015-04-21 01:42:27

标签: postgresql replace postgresql-8.4

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

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

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

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

但是我需要根据当天取代某些动态,并且该帖子会替换已知值。

3 个答案:

答案 0 :(得分: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()语句都可以。那实际上并不是“动态的”。如果工作日只是为了说明问题,而你实际上必须处理更多案例或真正的动态字符串,我会考虑采用不同的方法。在此相关答案中找到完全动态解决方案

答案 1 :(得分:0)

您应该可以使用嵌套的replace()执行此操作:

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

如果该值不在字符串中,则不会发生任何事情。

答案 2 :(得分:0)

另一种选择是递归函数:

window.open(img.src);

结果:

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;$$;