Czy można zanegować klauzulę Where?
na przykład
DELETE * FROM table WHERE id != 2;
Czy można zanegować klauzulę Where?
na przykład
DELETE * FROM table WHERE id != 2;
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), dodaj OR id IS NULL
do klauzuli WHERE.
!= 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
Możesz wykonać następujące czynności:
DELETE * FROM table WHERE NOT(id = 2);
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ń.
Tak. Jeśli pamięć mi służy, to powinno działać. Nasz możesz użyć:
DELETE FROM table WHERE id <> 2
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)
id != NULL
czy nie działa zgodnie z oczekiwaniami.