SQL WHERE Bedingung ist nicht gleich?

92

Ist es möglich, eine where-Klausel zu negieren?

z.B

DELETE * FROM table WHERE id != 2;
Frank Vilea
quelle
4
Zu Ihrer Information, id != NULLfunktioniert nicht wie erwartet.
Joshua Pinter

Antworten:

155

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 NULLder WHERE-Klausel hinzu.

Praveen Lobo
quelle
Ich habe diesen Befehl ein paar Mal ausprobiert. Aber es schien nicht zu funktionieren, bis mir klar wurde, dass DELETE in MySQL das * ..
Frank Vilea
Dort haben Sie die Antwort bearbeitet, um das * zu entfernen. Vielen Dank für den Hinweis.
Praveen Lobo
5
Nur ein allgemeiner Kommentar für Leute, die hierher gekommen sind und sich gefragt haben, warum sie != NULLnicht 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 .
Byson
31

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
Frank Schmitt
quelle
12
delete from table where id <> 2



edit: um die Syntax für MySQL zu korrigieren

Fosco
quelle
11

Sie können Folgendes tun:

DELETE * FROM table WHERE NOT(id = 2);
Magier
quelle
1
Funktioniert gut, wenn der Wert nicht numerisch ist. WHERE NOT (id = 'two');
Kareem
9

Verwenden Sie <>diese Option, um die where-Klausel zu negieren.

Brandon
quelle
7

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.

Nicholas Carey
quelle
6

WHERE id <> 2 sollte gut funktionieren ... Ist es das, wonach Sie suchen?

JNK
quelle
4

Ja. Wenn mir das Gedächtnis dient, sollte das funktionieren. Unsere könnten Sie verwenden:

DELETE FROM table WHERE id <> 2
dkruythoff
quelle
3

Beste Lösung ist zu verwenden

DELETE FROM table WHERE id NOT IN ( 2 )
trusha
quelle
0

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)
user2956206
quelle