私は次のようなテーブルを持っています:
ID | 名前1 | 名前2 | 名前3
1 | アサ | ヌル | ダス
2 | ヌル | ヌル | と同じように
NULL 値の 2 倍以上の行 (ここでは、id = 2 の行) をすべて削除したいです。
既に小さな PHP スクリプトでそれを実行しましたが、mysql クエリでそれを実行できるかどうか疑問に思っています。
私はmysqlを初めて使用するので、まだ何も試していません!
私は次のようなテーブルを持っています:
ID | 名前1 | 名前2 | 名前3
1 | アサ | ヌル | ダス
2 | ヌル | ヌル | と同じように
NULL 値の 2 倍以上の行 (ここでは、id = 2 の行) をすべて削除したいです。
既に小さな PHP スクリプトでそれを実行しましたが、mysql クエリでそれを実行できるかどうか疑問に思っています。
私はmysqlを初めて使用するので、まだ何も試していません!
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 を参照してください
関連して、すべての列が null である行を削除する必要がある場合は、これを実行できます。
このプロシージャは、ID として設定される可能性があるプライマリ列を無視して、null であるすべての列の行を削除します。
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');
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)
を使用IS NULL
して、各列のブール値 (0 または 1) を取得し、それらの結果を合計して、合計が 2 以上の行を削除できます。
このような:
delete from your_table
where ((name1 is null) + (name2 is null) + (name3 is null)) >= 2