SQL WHERE warunek nie jest równy?

95

Czy można zanegować klauzulę Where?

na przykład

DELETE * FROM table WHERE id != 2;
Frank Vilea
źródło
4
FYI, id != NULLczy nie działa zgodnie z oczekiwaniami.
Joshua Pinter

Odpowiedzi:

160

Możesz to zrobić

DELETE FROM table WHERE id NOT IN ( 2 )

LUB

DELETE FROM table WHERE id <>  2 

Jak zauważył @Frank Schmitt, możesz również uważać na wartości NULL. Jeśli chcesz usunąć wszystko, co nie jest 2(w tym wartości NULL), dodaj OR id IS NULLdo klauzuli WHERE.

Praveen Lobo
źródło
Próbowałem tego polecenia kilka razy ... ale wydawało się, że nie działa, dopóki nie zdałem sobie sprawy, że DELETE w MySQL nie używa * ..
Frank Vilea
Proszę bardzo, zredagowałeś odpowiedź, aby usunąć * Dziękuję za wskazanie.
Praveen Lobo
5
Tylko ogólny komentarz dla osób, które przyszły tutaj i zastanawiały się, dlaczego ich != NULLnie działa: „Nie można używać arytmetycznych operatorów porównania, takich jak =, <lub <>, aby sprawdzić wartość NULL”. ( z dokumentacji MySQL ). Oznacza to, że musisz użyć IS NOT NULL .
Byson
31

Na Twoje pytanie odpowiedziały już inne plakaty, chciałbym tylko to podkreślić

 delete from table where id <> 2

(lub ich warianty, a nie id = 2 itd.) nie usunie wierszy, w których id ma wartość NULL.

Jeśli chcesz również usunąć wiersze z id = NULL:

delete from table where id <> 2 or id is NULL
Frank Schmitt
źródło
12
delete from table where id <> 2



edycja: poprawienie składni MySQL

Fosco
źródło
12

Możesz wykonać następujące czynności:

DELETE * FROM table WHERE NOT(id = 2);
Magicianeer
źródło
1
Działa dobrze, jeśli wartość nie jest liczbowa GDZIE NIE (id = 'dwa');
Kareem
9

Służy <>do negowania klauzuli where.

Brandon
źródło
7

Wróć do logiki formalnej i algebry. Wyrażenie takie jak

A & B & (D | E)

można zanegować na kilka sposobów:

  • Oczywisty sposób:

    !( A & B & ( D | E ) )
    
  • Powyższe również można powtórzyć, wystarczy pamiętać o niektórych właściwościach wyrażeń logicznych:

    • !( A & B )jest odpowiednikiem (!A | !B).
    • !( A | B )jest odpowiednikiem (!A & !B).
    • !( !A ) jest odpowiednikiem (A).

    Rozłóż NOT (!) Na całe wyrażenie, do którego ma zastosowanie, odwracając operatory i eliminując podwójne negatywy w trakcie:

        !A | !B | ( !D & !E )
    

Tak więc, ogólnie rzecz biorąc, każda klauzula gdzie może zostać zanegowana zgodnie z powyższymi zasadami. Zaprzeczenie tego

select *
from foo
where      test-1
  and      test-2
  and (    test-3
        OR test-4
      )

jest

select *
from foo
where NOT(          test-1
           and      test-2
           and (    test-3
                 OR test-4
               )
         )

lub

select *
from foo
where        not test-1
  OR         not test-2
  OR   (     not test-3
         and not test-4
       )

Co jest lepsze? To bardzo kontekstowe pytanie. Tylko ty możesz o tym zdecydować.

Należy jednak pamiętać, że użycie NOT może wpłynąć na to, co optymalizator może lub nie może zrobić. Możesz uzyskać mniej niż optymalny plan zapytań.

Nicholas Carey
źródło
6

WHERE id <> 2 powinno działać dobrze ... Czy o to ci chodzi?

JNK
źródło
4

Tak. Jeśli pamięć mi służy, to powinno działać. Nasz możesz użyć:

DELETE FROM table WHERE id <> 2
dkruythoff
źródło
3

Najlepszym rozwiązaniem jest użycie

DELETE FROM table WHERE id NOT IN ( 2 )
trusha
źródło
0

Właśnie rozwiązałem ten problem. Jeśli użyjesz <> lub nie znajdujesz się w zmiennej, czyli null, spowoduje to false. Więc zamiast <> 1, musisz to sprawdzić w ten sposób:

 AND (isdelete is NULL or isdelete = 0)
user2956206
źródło