SQL WHERE Bedingung ist nicht gleich?


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.


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

12
delete from table where id <> 2



edit: um die Syntax für MySQL zu korrigieren


11

Sie können Folgendes tun:

DELETE * FROM table WHERE NOT(id = 2);

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.


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.


6

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


4

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

DELETE FROM table WHERE id <> 2

3

Beste Lösung ist zu verwenden

DELETE FROM table WHERE id NOT IN ( 2 )

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.