Postgres查询检查字符串是一个数字

use*_*782 26 postgresql

任何人都可以告诉我查询字符串是否是一个数字(双精度).如果字符串是数字,它应该返回true.否则它应该返回false.

考虑:

       s1 character varying;
       s2 character varying;

       s1 ='12.41212' => should return true
       s2 = 'Service' => should return false
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 51

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

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

select 'Service' ~ '^[0-9\.]+$'
=> false
Run Code Online (Sandbox Code Playgroud)

  • .123.456.789.也会通过这个正则表达式 (9认同)

ns1*_*s16 15

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

SELECT '12.41212' ~ '^\d+(.\d+)?$'; #true
SELECT 'Service' ~ '^\d+(.\d+)?$'; #false
Run Code Online (Sandbox Code Playgroud)


Fer*_*mes 11

我创建了一个函数来检查这一点,使用“try catch”。

该函数尝试将文本转换为“数字”。如果转换正确则返回 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";
Run Code Online (Sandbox Code Playgroud)

  • 哇,使用内置类型转换的唯一答案。我只是想知道我们是否可以使用类型转换而不求助于 pl/pgSQL 函数? (2认同)

小智 10

我想提出另一项建议,因为12a345收益true由NS16的回答.

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
Run Code Online (Sandbox Code Playgroud)


jho*_*nna 7

select s1 ~ '^\d+$';
select s2 ~ '^\d+$';
Run Code Online (Sandbox Code Playgroud)


小智 6

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

^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$
Run Code Online (Sandbox Code Playgroud)

导致:

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

一样真实。

表达式来自:https : //www.regular-expressions.info/floatingpoint.html

您可以检查其他类型的数字,例如,如果您希望使用带符号的十进制数。

 select '-12.1254' ~ '^[-+]?[0-9]*\.?[0-9]+$';
Run Code Online (Sandbox Code Playgroud)


Mat*_*lda 5

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

select '12.41212' ~ '^\d+\.?\d+$'; -- true
select 'Service' ~ '^\d+\.?\d+$'; -- false
Run Code Online (Sandbox Code Playgroud)

这也接受整数和负数:

select '-1241212' ~ '^-?\d*\.?\d+$'; -- true
Run Code Online (Sandbox Code Playgroud)

  • 正则表达式 '^\d+\.?\d+$' 不允许使用单位数字。请使用 '^\d*\.?\d+$' 代替 (2认同)