在 MariaDB 中仅返回数值

发布于

以下 MariaDB 示例仅返回在给定列中具有数值的那些行。

这些示例使用该函数返回与指定模式匹配的值。REGEXP

示例数据

假设我们创建一个这样的表:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    c1 varchar(255)
);

INSERT INTO t1 (c1) VALUES 
    ('0'),
    ('1'),
    ('+1'),
    ('-1'),
    ('00.00'),
    ('73.45'),
    ('+73.45'),
    ('-73.45'),
    ('.246'),
    ('-.34e7'),
    ('12.e-3'),
    ('1.2e+4'),
    ('a'),
    ('9afc'),
    ('e7'),
    ('+e0'),
    ('Ten'),
    ('5 Dollars');

SELECT * FROM t1;

该表现已创建,其中包含以下数据:

+———–+ | c1 | +———–+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 12.e-3 | | 1.2e+4 | | a | | 9afc | | e7 | | +e0 | | Ten | | 5 Dollars | +———–+

该列是列,因此它不是数字。它可以(并且确实)包含数字,但这些数字存储为字符数据。它还可以包含任意文本(它确实如此)。varchar(255)

返回所有数值

我们可以使用以下查询返回上表中的所有数值:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

输出:

+--------+
| c1     |
+--------+
| 0      |
| 1      |
| +1     |
| -1     |
| 00.00  |
| 73.45  |
| +73.45 |
| -73.45 |
| .246   |
| -.34e7 |
| 1.2e+4 |
| e7     |
| +e0    |
+--------+

Return Integers

If we only want to return integers, the query can be a lot simpler:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[0-9]+$';

Result:

+——+ | c1 | +——+ | 0 | | 1 | +——+

Contains Numeric Data

If we want to find rows that merely contain numeric data (even if they also contain non-numeric data), we can do the following:

SELECT c1 
FROM t1 
WHERE c1 REGEXP '[0-9]+';

输出:

+-----------+
| c1        |
+-----------+
| 0         |
| 1         |
| +1        |
| -1        |
| 00.00     |
| 73.45     |
| +73.45    |
| -73.45    |
| .246      |
| -.34e7    |
| 12.e-3    |
| 1.2e+4    |
| 9afc      |
| e7        |
| +e0       |
| 5 Dollars |
+-----------+

POSIX 字符类

MariaDB 支持 POSIX 字符类,这意味着我们可以代替正则表达式使用。[:digit:]``[0-9]

例:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[[:digit:]]?$';

输出:

+------+
| c1   |
+------+
| 0    |
| 1    |
+------+