Author: | Wojciech Muła |
---|---|
Added on: | 2013-10-06 |
PostgreSQL wiki has entry about sprintf — is is quite simple approach (and isn't marked as immutable). The main drawback is iterating over all chars of a format string. Here is a version that use strpos to locate % in the format string, and it's faster around 2 times:
CREATE OR REPLACE FUNCTION printf2(fmt text, variadic args anyarray) RETURNS text LANGUAGE plpgsql IMMUTABLE AS $$ DECLARE argcnt int := 1; head text := ”; -- result tail text := fmt; -- unprocessed part k int; BEGIN LOOP k := strpos(tail, '%'); IF k = 0 THEN -- no more '%' head := head || tail; EXIT; ELSE IF substring(tail, k+1, 1) = '%' THEN -- escape sequence '%%' head := head || substring(tail, 1, k); tail := substring(tail, k+2); ELSE -- insert argument head := head || substring(tail, 1, k-1) || COALESCE(args[argcnt]::text, ”); tail := substring(tail, k+1); argcnt := argcnt + 1; END IF; END IF; END LOOP; RETURN head; END; $$;