È possibile negare una clausola where?
per esempio
DELETE * FROM table WHERE id != 2;
È possibile negare una clausola where?
per esempio
DELETE * FROM table WHERE id != 2;
Risposte:
Puoi fare così
DELETE FROM table WHERE id NOT IN ( 2 )
O
DELETE FROM table WHERE id <> 2
Come ha notato @Frank Schmitt, potresti voler stare attento anche ai valori NULL. Se vuoi eliminare tutto ciò che non lo è 2
(inclusi i NULL), aggiungi OR id IS NULL
alla clausola WHERE.
!= NULL
non funzionano: "Non è possibile utilizzare operatori di confronto aritmetico come =, <o <> per testare NULL." ( dalla documentazione di MySQL ). Quindi questo significa che devi usare IS NOT NULL
.
La tua domanda ha già ricevuto risposta dagli altri poster, vorrei solo farti notare
delete from table where id <> 2
(o sue varianti, non id = 2 ecc.) non eliminerà le righe in cui id è NULL.
Se vuoi eliminare anche le righe con id = NULL:
delete from table where id <> 2 or id is NULL
Potresti fare quanto segue:
DELETE * FROM table WHERE NOT(id = 2);
Ripensa alla logica formale e all'algebra. Un'espressione come
A & B & (D | E)
può essere negato in due modi:
Il modo ovvio:
!( A & B & ( D | E ) )
Quanto sopra può anche essere riformulato, è sufficiente ricordare alcune proprietà delle espressioni logiche:
!( A & B )
è l'equivalente di (!A | !B)
.!( A | B )
è l'equivalente di (!A & !B)
.!( !A )
è l'equivalente di (A).Distribuisci il NOT (!) Sull'intera espressione a cui si applica, invertendo gli operatori ed eliminando i doppi negativi man mano che procedi:
!A | !B | ( !D & !E )
Quindi, in generale, qualsiasi clausola where può essere negata secondo le regole di cui sopra. La negazione di questo
select *
from foo
where test-1
and test-2
and ( test-3
OR test-4
)
è
select *
from foo
where NOT( test-1
and test-2
and ( test-3
OR test-4
)
)
o
select *
from foo
where not test-1
OR not test-2
OR ( not test-3
and not test-4
)
Che è migliore? Questa è una domanda molto sensibile al contesto. Solo tu puoi deciderlo.
Tieni presente, tuttavia, che l'uso di NOT può influenzare ciò che l'ottimizzatore può o non può fare. Potresti ottenere un piano di query non ottimale.
Sì. Se la memoria mi serve, dovrebbe funzionare. Il nostro potresti usare:
DELETE FROM table WHERE id <> 2
Stavo solo risolvendo questo problema. Se usi <> o non sei in una variabile, che è nulla, risulterà falso. Quindi invece di <> 1, devi controllarlo in questo modo:
AND (isdelete is NULL or isdelete = 0)
id != NULL
non non funzionare come ci si aspetterebbe.