6

我有一张像这样的桌子:

编号 | 名称1 | 名称2 | 名称3
1 | 阿萨 | 空 | 达斯
2 | 空 | 空 | 阿萨斯

我想删除每行有两次或更多次 NULL 值(这里是 id = 2 的行)
我已经用一个小的 PHP 脚本做到了,但我想知道这是否可以用 mysql 查询来完成

我是mysql的新手,所以我还没有尝试任何东西!

4

4 回答 4

5

您将希望使用WHERE具有多个过滤器的子句,每个检查是列是null

delete 
from yourtable
where 
  (name1 is null and name2 is null) or
  (name1 is null and name3 is null) or
  (name2 is null and name3 is null) or
  (name1 is null and name2 is null and name3 is null) 

请参阅带有演示的 SQL Fiddle

于 2013-03-28T19:57:49.947 回答
1
delete from table where 
     (name1 is null AND name2 is null) OR
     (name2 is null AND name3 is null) OR
     (name1 is null AND name3 is null) OR
     (name1 is null AND name2 is null AND name3 is null)
于 2013-03-28T19:54:46.140 回答
1

您可以使用IS NULL获取每列的布尔值(0 或 1),对这些结果求和并删除总和大于或等于 2 的行。

像这样:

delete from your_table
where ((name1 is null) + (name2 is null) + (name3 is null)) >= 2 
于 2013-03-28T20:10:32.327 回答
1

相关,如果您需要删除所有列都为空的行,您可以执行此操作。

该过程将删除所有为空的列的任何行,忽略可能设置为 ID 的主列。

DELIMITER //
CREATE PROCEDURE DeleteRowsAllColNull(IN tbl VARCHAR(64))
BEGIN
SET @tbl = tbl;
SET SESSION group_concat_max_len = 1000000;
SELECT CONCAT('DELETE FROM `',@tbl,'` WHERE ',(REPLACE(group_concat(concat('`',COLUMN_NAME, '` is NULL')),',',' AND ')),';') FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = @tbl AND COLUMN_KEY NOT LIKE 'PRI' into @delete_all;
PREPARE delete_all FROM @delete_all;
EXECUTE delete_all;
DEALLOCATE PREPARE delete_all;
END //
DELIMITER ;

执行这样的程序。

CALL DeleteRowsAllColNull('your table');
于 2016-02-14T12:52:47.247 回答