【发布时间】:2013-04-24 15:25:45
【问题描述】:
我需要确定给定的字符串是否可以在 SQL 语句中解释为数字(整数或浮点数)。如下:
SELECT AVG(CASE WHEN x ~ '^[0-9]*.?[0-9]*$' THEN x::float ELSE NULL END) FROM test
我发现 Postgres 的 pattern matching 可以用于此。所以我修改了this place 中给出的语句来合并浮点数。这是我的代码:
WITH test(x) AS (
VALUES (''), ('.'), ('.0'), ('0.'), ('0'), ('1'), ('123'),
('123.456'), ('abc'), ('1..2'), ('1.2.3.4'))
SELECT x
, x ~ '^[0-9]*.?[0-9]*$' AS isnumeric
FROM test;
输出:
x | isnumeric
---------+-----------
| t
. | t
.0 | t
0. | t
0 | t
1 | t
123 | t
123.456 | t
abc | f
1..2 | f
1.2.3.4 | f
(11 rows)
如您所见,前两项(空字符串'' 和唯一的句点'.')被错误分类为数字类型(它们不是)。我现在无法接近这一点。任何帮助表示赞赏!
更新基于this answer(及其cmets),我将模式调整为:
WITH test(x) AS (
VALUES (''), ('.'), ('.0'), ('0.'), ('0'), ('1'), ('123'),
('123.456'), ('abc'), ('1..2'), ('1.2.3.4'), ('1x234'), ('1.234e-5'))
SELECT x
, x ~ '^([0-9]+[.]?[0-9]*|[.][0-9]+)$' AS isnumeric
FROM test;
这给出了:
x | isnumeric
----------+-----------
| f
. | f
.0 | t
0. | t
0 | t
1 | t
123 | t
123.456 | t
abc | f
1..2 | f
1.2.3.4 | f
1x234 | f
1.234e-5 | f
(13 rows)
正如我现在所看到的,科学记数法和负数仍然存在一些问题。
【问题讨论】:
-
您不必担心负数吗?科学记数法呢?
-
@muistooshort 再次感谢,我对这种输入特别感兴趣。这种模式匹配方法并不像我预期的那么简单。
-
负数的正则表达式很简单:
'^-?([0-9]+[.]?[0-9]*|[.][0-9]+)$'正确吗?
标签: regex postgresql