特定の文字列が SQL ステートメントで数値 (整数または浮動小数点) として解釈できるかどうかを判断する必要があります。次のように:
SELECT AVG(CASE WHEN x ~ '^[0-9]*.?[0-9]*$' THEN x::float ELSE NULL END) FROM test
これには Postgres のパターン マッチングを使用できることがわかりました。そのため、この場所で与えられたステートメントを適応させて、浮動小数点数を組み込みました。これは私のコードです:
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)
ご覧のとおり、最初の 2 つの項目 (空の文字列''
と唯一のピリオド'.'
) は、数値型として誤分類されています (実際にはそうではありません)。現時点ではこれ以上近づくことはできません。どんな助けでも大歓迎です!
更新この回答(およびそのコメント) に基づいて、パターンを次のように調整しました。
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)
私が今見ているように、科学的表記法と負の数にはまだいくつかの問題があります。