SQL WHERE warunek nie jest równy?


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.


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

12
delete from table where id <> 2



edycja: poprawienie składni MySQL


12

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

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

1
Działa dobrze, jeśli wartość nie jest liczbowa GDZIE NIE (id = 'dwa');
Kareem


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ń.


6

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


4

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

DELETE FROM table WHERE id <> 2

3

Najlepszym rozwiązaniem jest użycie

DELETE FROM table WHERE id NOT IN ( 2 )

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.