お気づきかもしれませんが、正規表現ベースの方法を正しく実行することはほとんど不可能です。たとえば、テストでは1.234e-5
有効な番号ではありませんが、実際には有効です。また、あなたは負の数を逃しました。何かが数字のように見えるが、それを保存しようとするとオーバーフローが発生する場合はどうなりますか?
代わりに、実際にNUMERIC
にキャストしようとする関数を作成することをお勧めします (またはFLOAT
タスクで必要な場合)、TRUE
を返します またはFALSE
このキャストが成功したかどうかによって異なります。
このコードは、関数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)
より正確で読みやすいだけでなく、データが実際に数値である場合はより高速に動作します。