我需要確定給定的字符串是否可以在SQL語句中被解釋爲數字(整數或浮點數)。如下所示:帶PostgreSQL的isnumeric()
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(及其評論),我適應的模式:
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)
仍然有一些問題與科學正如我現在所看到的,符號和負數。
您是否需要擔心負數?科學記數法如何? – 2013-04-24 16:28:46
@ muistooshort再次感謝,我對這種輸入特別感興趣。這種模式匹配方法並不像我預期的那樣直截了當。 – moooeeeep 2013-04-24 19:34:55
負數的正則表達式很簡單: ''^ - ?([0-9] + [。]?[0-9] * | [。] [0-9] +)$''正確嗎? – 2015-10-15 16:27:45