Tôi cần phải xác định liệu một chuỗi đã cho có thể được hiểu là một số (số nguyên hoặc dấu chấm động) trong một câu lệnh SQL hay không. Như sau:isnumeric() với PostgreSQL
SELECT AVG(CASE WHEN x ~ '^[0-9]*.?[0-9]*$' THEN x::float ELSE NULL END) FROM test
Tôi thấy rằng Postgres 'pattern matching có thể được sử dụng cho việc này. Và vì vậy tôi đã điều chỉnh tuyên bố được đưa ra trong this place để kết hợp các số dấu phẩy động. Đây là mã của tôi:
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;
Sản lượng:
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)
Như bạn có thể thấy, hai mục đầu tiên (chuỗi rỗng ''
và giai đoạn duy nhất '.'
) đều được phân loại sai như là một loại số (mà họ không). Tôi không thể tiến gần hơn nữa vào lúc này. Bất kỳ trợ giúp nào được đánh giá cao!
Cập nhật Dựa trên this answer (và ý kiến của mình), tôi thích nghi mô hình để:
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;
Mà cho:
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)
Hiện vẫn còn một số vấn đề với các khoa học ký hiệu và với số âm, như tôi thấy bây giờ.
Bạn có phải lo lắng về số âm? Làm thế nào về ký hiệu khoa học? –
@muistooshort cảm ơn một lần nữa, tôi đặc biệt quan tâm đến kiểu đầu vào này. Cách tiếp cận đối sánh mẫu này không thẳng thắn như tôi mong đợi. – moooeeeep
Regex cho số âm đơn giản là: ''^ -? ([0-9] + [.]? [0-9] * | [.] [0-9] +) $'' đúng? –