假设我有这个字符串:'2015/4/21 (Tuesday)'
。我想用另一个字符串替换'Tuesday',例如:'cat'。结果应为:'2015/4/21 (cat)'
。
但我也希望它是动态的,如果它是'星期二',那么'猫'。如果它是'星期一',那么它是狗等等。
如何在PostgreSQL 8.4中执行此操作?
有一个类似的帖子:postgresql - replace all instances of a string within text field
但是我需要根据当天取代某些动态,并且该帖子会替换已知值。
答案 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;$$;