任何人都可以告诉我查询字符串是否是一个数字(双精度).如果字符串是数字,它应该返回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)
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)
小智 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)
小智 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)
如果您只需要接受双精度数字,这应该可以正常工作:
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)
| 归档时间: |
|
| 查看次数: |
27687 次 |
| 最近记录: |