val функция должна возвращать числовое значение из строки до первого нецифрового символа, учитывая также первую десятичную точку:
val('1,2TEST') should return 1.2
val('1,2,3') should return 1.2
val('-1,2,3') should return -1.2
val('') shound return 0
Я старался
CREATE OR REPLACE FUNCTION public.VAL(value text)
RETURNS numeric AS
$BODY$
SELECT coalesce(nullif('0'||substring(Translate($1,',','.'), '^-?[0-9]+\.?[0-9]*$'),''),'0')::numeric;
$BODY$ language sql immutable;
но если строка содержит символ %,
select val('1,2%')
возвращает 0.
Как заставить его вернуться на 1.2? Он должен работать, начиная с Postgres 9
Обновить
Gordon Fiddle для поддержки 9.5 возвращает null для нечисловой строки. Я решил это с помощью обертки:
CREATE OR REPLACE FUNCTION public.VALwithNull(value text)
RETURNS numeric AS
$BODY$
SELECT replace( (regexp_matches($1, '^-?[0-9]+,*[0-9]*'))[1], ',', '.') ::numeric;
$BODY$ language sql immutable;
CREATE OR REPLACE FUNCTION public.VAL(value text)
RETURNS numeric AS
$BODY$
SELECT coalesce( VALwithNull($1) ,0) ;
$BODY$ language sql immutable;
select val('') , val('test'), val('-77,7%')
Это лучший способ поддерживать 9.0+?