如何删除 MySql 中 ColB 的所有非数值行?

How do I drop all rows with a non numeric value for ColB in MySql?

我想删除 Col2 中包含非数字值的所有行。我不确定如何在 Sql 中执行此操作。

Col1    Col2  Col3

word1   123    Code
word2   124    Code
word3   tttt   code

Drop  * row from db.Table 
where col2 Value is not numeric;

我希望 table 看起来像这样:

Col1    Col2  Col3

word1   123    Code
word2   124    Code

在 ANSI 标准 SQL 中,您可以使用类似的东西非常接近:

delete from t
    where substring(col2, 1, 1) between '0' and '9';

大多数数据库支持更精细的比较方法。例如,在 SQL 服务器中你可以这样做:

delete from t
    where try_convert(int, col2) is null;

在甲骨文中:

delete from t
    where regexp_like(col2, '[^0-9]');

在MySQL中:

delete from t
    where col2 regexp '[^0-9]';

您可以尝试将 regexp 关键字与 [^0-9]+

一起使用

[^0-9]+ 将包含非数字值。

delete from t
where col2 regexp '[^0-9]+';

sqlfiddle:http://sqlfiddle.com/#!9/3717d/1

您不需要使用正则表达式,将您的列设为 TEXT 数据类型会导致各种存储和 I/O 问题。

只需使用

DELETE FROM t1 WHERE concat('',coalesce(col2,1) * 1) <> coalesce(col2,0) ;

============================================= =================

SQL Fiddle

MySQL 5.6 初始架构设置:

CREATE TABLE t1( col1 varchar(50), col2 varchar(50), col3 varchar(50) );

INSERT INTO t1 (col1,col2,col3) 
SELECT 'word1','123','Code' UNION ALL
SELECT 'word2','124','Code' UNION ALL
SELECT 'word3','tttt','Code' UNION ALL
SELECT 'word4','5ttt','Code' UNION ALL
SELECT 'word5','ttt5','Code'
;

CREATE TABLE t1_before ( col1 varchar(50), col2 varchar(50), col3 varchar(50) );
INSERT INTO t1_before (col1, col2, col3)
SELECT *
FROM t1 ;

删除前:

SELECT * FROM t1_before 

|  col1 | col2 | col3 |
|-------|------|------|
| word1 |  123 | Code |
| word2 |  124 | Code |
| word3 | tttt | Code |
| word4 | 5ttt | Code |
| word5 | ttt5 | Code |

删除语句

DELETE FROM t1 WHERE concat('',coalesce(col2,1) * 1) <> coalesce(col2,0) ;

删除后:

SELECT * FROM t1 


|  col1 | col2 | col3 |
|-------|------|------|
| word1 |  123 | Code |
| word2 |  124 | Code |

编辑:我更改了我的 DELETE 语句以说明 Col2 中的 NULL 值。