2013-03-28 7 views
5

Ho una tabella del tipo:mysql - eliminare le righe se nulla esiste più di un num specifica

id | name1 | name2 | name3
 1 | asa | NULL | das
 2 | NULL | NULL | asas

voglio eliminare ogni riga che ha due o più volte il valore NULL (qui, quello con id = 2)
ho già fatto con un piccolo script PHP, ma mi chiedo se questo può essere fatto con una query mysql

sono nuovo di mysql in modo che io non ho provato ancora nulla!

+0

Ironia della sorte, questa domanda è un duplicato: P http://stackoverflow.com/questions/2630440/how-to-delete-duplicates-on-mysql-table –

+1

@BenjaminGruenbaum Non sono d'accordo - la questione legata chiede come eliminare i duplicati, mentre questa domanda riguarda l'eliminazione di righe non duplicate che soddisfano determinati criteri (qui: almeno due colonne su tre sono NULL) –

+0

@FrankSchmitt Non ho detto che è un duplicato esatto, è strettamente correlato imo. Punto valido –

risposta

4

Si vuole utilizzare una clausola WHERE con più filtri, ognuno controllo è la colonna è 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) 

Vedi SQL Fiddle with Demo

+0

+1 solo perché – Kermit

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) 
+0

Questa è la stessa risposta data da @ bluefeet ♦ –

+0

E noterete che l'ho postata 3 minuti prima. – ajspacemanspiff

+0

Mi chiedo perché l'altro post abbia avuto più uptotes del tuo? –

1

È possibile utilizzare IS NULL per ottenere un valore booleano (0 o 1) per ogni colonna, somma questi risultati ed elimina le righe in cui la somma è maggiore o uguale a 2.

Ti piace questa:

delete from your_table 
where ((name1 is null) + (name2 is null) + (name3 is null)) >= 2 
+0

+1 per essere diverso B-) –

0

correlati, se è necessario eliminare le righe in cui tutte le colonne sono nulle si può fare questo.

La procedura eliminerà qualsiasi riga per tutte le colonne che ignorano la colonna primaria che può essere impostata come 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 ; 

Eseguire la procedura in questo modo.

CALL DeleteRowsAllColNull('your table'); 
Problemi correlati