如何删除 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) ;
============================================= =================
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
值。
我想删除 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) ;
============================================= =================
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
值。