如何创建返回值最多为第一个非数字/十进制字符的函数

2ledvvac  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(355)

val函数应返回从字符串到第一个非数字字符的数值,同时考虑到第一个小数点:

  1. val('1,2TEST') should return 1.2
  2. val('1,2,3') should return 1.2
  3. val('-1,2,3') should return -1.2
  4. val('') shound return 0

我试过了

  1. CREATE OR REPLACE FUNCTION public.VAL(value text)
  2. RETURNS numeric AS
  3. $BODY$
  4. SELECT coalesce(nullif('0'||substring(Translate($1,',','.'), '^-?[0-9]+\.?[0-9]*$'),''),'0')::numeric;
  5. $BODY$ language sql immutable;

但如果字符串包含%字符,

  1. select val('1,2%')

返回0。
如何强制它返回1.2?应该从第九学期开始
更新
gordon fiddle for 9.5支持为非数字字符串返回null。我用 Package 器解决了这个问题:

  1. CREATE OR REPLACE FUNCTION public.VALwithNull(value text)
  2. RETURNS numeric AS
  3. $BODY$
  4. SELECT replace( (regexp_matches($1, '^-?[0-9]+,*[0-9]*'))[1], ',', '.') ::numeric;
  5. $BODY$ language sql immutable;
  6. CREATE OR REPLACE FUNCTION public.VAL(value text)
  7. RETURNS numeric AS
  8. $BODY$
  9. SELECT coalesce( VALwithNull($1) ,0) ;
  10. $BODY$ language sql immutable;
  11. select val('') , val('test'), val('-77,7%')

这是支持9.0+的最佳方式吗?

yvt65v4c

yvt65v4c1#

我认为这个正则表达式符合您的要求:

  1. replace( (regexp_match($1, '^-?[0-9]+,*[0-9]*') )[1], ',', '.')

这是一把小提琴。
你也可以使用 regexp_matches() . 在这种情况下也是这样。

相关问题