Czy można zanegować klauzulę Where?
na przykład
DELETE * FROM table WHERE id != 2;
mysql
sql
where-clause
negate
Frank Vilea
źródło
źródło
id != NULL
czy nie działa zgodnie z oczekiwaniami.Odpowiedzi:
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), dodajOR id IS NULL
do klauzuli WHERE.źródło
!= NULL
nie 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
.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
źródło
delete from table where id <> 2
edycja: poprawienie składni MySQL
źródło
Możesz wykonać następujące czynności:
DELETE * FROM table WHERE NOT(id = 2);
źródło
Służy
<>
do negowania klauzuli where.źródło
Wróć do logiki formalnej i algebry. Wyrażenie takie jak
można zanegować na kilka sposobów:
Oczywisty sposób:
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:
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ń.
źródło
WHERE id <> 2
powinno działać dobrze ... Czy o to ci chodzi?źródło
Tak. Jeśli pamięć mi służy, to powinno działać. Nasz możesz użyć:
DELETE FROM table WHERE id <> 2
źródło
Najlepszym rozwiązaniem jest użycie
DELETE FROM table WHERE id NOT IN ( 2 )
źródło
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:
źródło