postgresql 检查字符串是否为数字的Postgres查询

vfh0ocws  于 2023-01-30  发布在  PostgreSQL
关注(0)|答案(8)|浏览(528)

谁能告诉我检查字符串是否是数字的查询(双精度)。如果字符串是数字,它应该返回真。否则它应该返回假。
考虑:

s1 character varying;
       s2 character varying;

       s1 ='12.41212' => should return true
       s2 = 'Service' => should return false
x6492ojm

x6492ojm1#

我认为最简单的方法是正则表达式匹配:

select '12.41212' ~ '^[0-9\.]+$'
=> true

select 'Service' ~ '^[0-9\.]+$'
=> false
z18hc3ub

z18hc3ub2#

我想提出另一个建议,因为12a345通过ns16的答案返回true

SELECT '12.4121' ~ '^\d+(\.\d+)?$'; #true
SELECT 'ServiceS' ~ '^\d+(\.\d+)?$'; #false
SELECT '12a41212' ~ '^\d+(\.\d+)?$'; #false
SELECT '12.4121.' ~ '^\d+(\.\d+)?$'; #false
SELECT '.12.412.' ~ '^\d+(\.\d+)?$'; #false
oo7oh9g9

oo7oh9g93#

我修正了a_horse_with_no_name建议的正则表达式。

SELECT '12.41212' ~ '^\d+(\.\d+)?$'; -- true
SELECT 'Service' ~ '^\d+(\.\d+)?$'; -- false
zphenhs4

zphenhs44#

我创建了一个函数来检查这个问题,使用了“trycatch”。
函数试图将文本转换为“numeric”。如果转换正确,则返回true,如果转换失败,则返回false。

CREATE OR REPLACE FUNCTION "sys"."isnumeric"(text)
RETURNS "pg_catalog"."bool" AS $BODY$
DECLARE x NUMERIC;
BEGIN
    x = $1::NUMERIC;
    RETURN TRUE;
EXCEPTION WHEN others THEN
    RETURN FALSE;
END;
$BODY$
  LANGUAGE 'plpgsql' IMMUTABLE STRICT  COST 100
;

ALTER FUNCTION "sys"."isnumeric"(text) OWNER TO "postgres";
w8rqjzmb

w8rqjzmb5#

如果你想检查指数,+/-,那么最好的表达式是:

^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$

导致:

select '12.41212e-5' ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$' ;

是真的。
表达式来自:https://www.regular-expressions.info/floatingpoint.html
您可以检查其他类型的数字,例如,如果您希望使用带符号的decimal。

select '-12.1254' ~ '^[-+]?[0-9]*\.?[0-9]+$';
7kqas0il

7kqas0il6#

select s1 ~ '^\d+$';
select s2 ~ '^\d+$';
ctrmrzij

ctrmrzij7#

如果您只需要接受双精度数字,这应该可以正常工作:

select '12.41212' ~ '^\d+\.?\d+$'; -- true
select 'Service' ~ '^\d+\.?\d+$'; -- false

这也可以接受整数和负数:

select '-1241212' ~ '^-?\d*\.?\d+$'; -- true
0mkxixxg

0mkxixxg8#

基于Fernando's answer构建,这稍微短了一点,不需要声明变量,并给出了确切的异常类型(出于教学目的):

create or replace function isnumeric(string text) returns bool as $$
begin
  perform string::numeric;
  return true;
exception
when invalid_text_representation then
  return false;
end;
$$ language plpgsql security invoker;

相关问题