If you want to replace multiple strings in one go, you can of course nest the REPLACE function, eg. like this:
SELECT REPLACE(REPLACE(REPLACE(foo, 'apple', 'fruit'), 'banana', 'fruit'), 'lettuce', 'vegetable') FROM bar
If you have to do a lot of replacing, your code will become ugly and hard to read. Is there such a thing as a multi-replace function? Which would maybe take 2 arrays as arguments? To be sure, I’m familiar with the TRANSLATE function, but as my example indicates I want to replace whole words, not just single characters.
Advertisement
Answer
I would implement such a function in the following way:
CREATE OR REPLACE FUNCTION multi_replace(_string text, variadic _param_args text[]) RETURNS TEXT AS $BODY$ DECLARE _index integer; BEGIN FOR _index IN 1 .. cardinality(_param_args) - 1 by 2 loop _string := replace(_string, _param_args[_index], _param_args[_index+1]); end loop; RETURN _string; END; $BODY$ LANGUAGE plpgsql VOLATILE;
cardinality()
returns the length of the parameter array, and by 2
increases the loop index by 2 for every iteration so that it’s safe to use _index
and _index + 1
inside the loop to access the pairs that belong together.
Online example: https://rextester.com/LITG61720