在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 |
+------+