在MariaDB的列中查找所有非数值

发布于

如果您遇到应该是数字列的字符列,则始终有可能包含您不知道的非数字数据。

在 MariaDB 中,您可以运行如下所示的查询以从列返回非数字数据。

示例数据

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

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;

最后的陈述导致:SELECT

+———–+ | 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 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

输出:

+-----------+
| c1        |
+-----------+
| 12.e-3    |
| a         |
| 9afc      |
| Ten       |
| 5 Dollars |
+-----------+

返回非整数

如果我们只想返回非整数,查询可以简单得多:

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

输出:

+-----------+
| c1        |
+-----------+
| +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 c1 
FROM t1 
WHERE c1 NOT REGEXP '[0-9]+';

输出:

+------+
| c1   |
+------+
| a    |
| Ten  |
+------+

我们可以使用 POSIX 类来获得相同的结果:

SELECT c1
FROM t1 
WHERE c1 NOT REGEXP '[[:digit:]]';

输出:

+------+
| c1   |
+------+
| a    |
| Ten  |
+------+