La función val debe devolver el valor numérico desde la cadena hasta el primer carácter que no sea un dígito, considerando también el primer punto decimal:
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 0Lo intenté
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;pero si la cadena contiene el carácter %,
select val('1,2%')devuelve 0.
¿Cómo forzarlo a devolver 1.2? Debería funcionar a partir de Postgres 9
Actualizar
Gordon Fiddle para el soporte de 9.5 devuelve nulo para una cadena no numérica. Lo resolví usando wrapper:
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%')¿Es esta la mejor manera de admitir 9.0+?