Ist es möglich, eine where-Klausel zu negieren?
z.B
DELETE * FROM table WHERE id != 2;
Ist es möglich, eine where-Klausel zu negieren?
z.B
DELETE * FROM table WHERE id != 2;
Antworten:
Sie können dies tun
DELETE FROM table WHERE id NOT IN ( 2 )
ODER
DELETE FROM table WHERE id <> 2
Wie @Frank Schmitt bemerkte, sollten Sie auch bei den NULL-Werten vorsichtig sein. Wenn Sie alles löschen möchten, was nicht ist 2
(einschließlich der NULL-Werte), fügen Sie OR id IS NULL
der WHERE-Klausel hinzu.
!= NULL
nicht funktionieren: "Sie können keine arithmetischen Vergleichsoperatoren wie =, <oder <> verwenden, um auf NULL zu testen." ( aus der MySQL-Dokumentation ). Das heißt also, Sie müssen verwenden IS NOT NULL
.
Ihre Frage wurde bereits von den anderen Postern beantwortet, darauf möchte ich nur hinweisen
delete from table where id <> 2
(oder Varianten davon, nicht id = 2 usw.) löscht keine Zeilen, in denen id NULL ist.
Wenn Sie auch Zeilen mit id = NULL löschen möchten:
delete from table where id <> 2 or id is NULL
Schauen Sie zurück auf formale Logik und Algebra. Ein Ausdruck wie
A & B & (D | E)
kann auf verschiedene Arten negiert werden:
Der offensichtliche Weg:
!( A & B & ( D | E ) )
Das Obige kann auch angepasst werden. Sie müssen sich nur einige Eigenschaften logischer Ausdrücke merken:
!( A & B )
ist das Äquivalent von (!A | !B)
.!( A | B )
ist das Äquivalent von (!A & !B)
.!( !A )
ist das Äquivalent von (A).Verteilen Sie das NOT (!) Auf den gesamten Ausdruck, für den es gilt, invertieren Sie die Operatoren und eliminieren Sie dabei doppelte Negative:
!A | !B | ( !D & !E )
Daher kann im Allgemeinen jede where-Klausel gemäß den oben genannten Regeln negiert werden. Die Negation davon
select *
from foo
where test-1
and test-2
and ( test-3
OR test-4
)
ist
select *
from foo
where NOT( test-1
and test-2
and ( test-3
OR test-4
)
)
oder
select *
from foo
where not test-1
OR not test-2
OR ( not test-3
and not test-4
)
Welches ist besser? Das ist eine sehr kontextsensitive Frage. Nur Sie können das entscheiden.
Beachten Sie jedoch, dass die Verwendung von NOT Auswirkungen darauf haben kann, was der Optimierer kann oder nicht. Möglicherweise erhalten Sie einen nicht optimalen Abfrageplan.
Ja. Wenn mir das Gedächtnis dient, sollte das funktionieren. Unsere könnten Sie verwenden:
DELETE FROM table WHERE id <> 2
Ich habe gerade dieses Problem gelöst. Wenn Sie <> verwenden oder sich nicht in einer Variablen befinden, die null ist, führt dies zu false. Anstelle von <> 1 müssen Sie dies also wie folgt überprüfen:
AND (isdelete is NULL or isdelete = 0)
id != NULL
funktioniert nicht wie erwartet.