gpt4 book ai didi

regex - isnumeric() 与 PostgreSQL

转载 作者:行者123 更新时间:2023-11-29 11:07:01 24 4
gpt4 key购买 nike

我需要确定给定的字符串是否可以解释为 SQL 语句中的数字(整数或 float )。如下所示:

SELECT AVG(CASE WHEN x ~ '^[0-9]*.?[0-9]*$' THEN x::float ELSE NULL END) FROM test

我发现 Postgres 的 pattern matching 可以用于此。因此,我修改了 this place 中给出的语句以合并 float 。这是我的代码:

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(及其评论),我将模式调整为:

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)

正如我现在所见,科学记数法和负数仍然存在一些问题。

最佳答案

您可能已经注意到,基于正则表达式的方法几乎不可能正确执行。例如,您的测试表明 1.234e-5 不是有效数字,而实际上是这样。另外,您错过了负数。如果某些东西看起来像数字,但当您尝试存储它时会导致溢出怎么办?

相反,我建议创建尝试实际转换为 NUMERIC(或 FLOAT,如果您的任务需要)并返回 TRUEFALSE 取决于此转换是否成功。

此代码将完全模拟函数 ISNUMERIC():

CREATE OR REPLACE FUNCTION isnumeric(text) RETURNS BOOLEAN AS $$
DECLARE x NUMERIC;
BEGIN
x = $1::NUMERIC;
RETURN TRUE;
EXCEPTION WHEN others THEN
RETURN FALSE;
END;
$$
STRICT
LANGUAGE plpgsql IMMUTABLE;

对您的数据调用此函数会得到以下结果:

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, isnumeric(x) 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 | t
(13 rows)

它不仅更正确、更易于阅读,而且如果数据实际上是一个数字,它的工作速度也会更快。

关于regex - isnumeric() 与 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16195986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com