Có thể phủ định mệnh đề where không?
ví dụ
DELETE * FROM table WHERE id != 2;
Câu trả lời:
Bạn có thể làm như thế này
DELETE FROM table WHERE id NOT IN ( 2 )
HOẶC LÀ
DELETE FROM table WHERE id <> 2
Như @Frank Schmitt đã lưu ý, bạn cũng có thể muốn cẩn thận về các giá trị NULL. Nếu bạn muốn xóa mọi thứ không có 2
(bao gồm cả NULL) thì hãy thêm OR id IS NULL
vào mệnh đề WHERE.
!= NULL
không hoạt động: "Bạn không thể sử dụng các toán tử so sánh số học như =, <hoặc <> để kiểm tra NULL." ( từ tài liệu MySQL ). Vì vậy, có nghĩa là bạn phải sử dụng IS NOT NULL
.
Câu hỏi của bạn đã được trả lời bởi các áp phích khác, tôi chỉ muốn chỉ ra rằng
delete from table where id <> 2
(hoặc các biến thể của chúng, không phải id = 2, v.v.) sẽ không xóa các hàng có id là NULL.
Nếu bạn cũng muốn xóa các hàng có id = NULL:
delete from table where id <> 2 or id is NULL
Bạn có thể làm như sau:
DELETE * FROM table WHERE NOT(id = 2);
Nhìn lại logic hình thức và đại số. Một biểu hiện như
A & B & (D | E)
có thể bị phủ định theo một số cách:
Cách rõ ràng:
!( A & B & ( D | E ) )
Phần trên cũng có thể được trình bày lại, bạn chỉ cần nhớ một số thuộc tính của biểu thức logic:
!( A & B )
là tương đương với (!A | !B)
.!( A | B )
là tương đương với (!A & !B)
.!( !A )
là tương đương của (A).Phân phối NOT (!) Trên toàn bộ biểu thức mà nó áp dụng, đảo ngược các toán tử và loại bỏ các phủ định kép khi bạn tiếp tục:
!A | !B | ( !D & !E )
Vì vậy, nói chung, bất kỳ mệnh đề where có thể bị phủ định theo các quy tắc trên. Sự phủ định của điều này
select *
from foo
where test-1
and test-2
and ( test-3
OR test-4
)
Là
select *
from foo
where NOT( test-1
and test-2
and ( test-3
OR test-4
)
)
hoặc là
select *
from foo
where not test-1
OR not test-2
OR ( not test-3
and not test-4
)
Cái nào tốt hơn? Đó là một câu hỏi rất nhạy cảm với ngữ cảnh. Chỉ bạn mới có thể quyết định điều đó.
Tuy nhiên, hãy lưu ý rằng việc sử dụng NOT có thể ảnh hưởng đến những gì trình tối ưu hóa có thể hoặc không thể làm. Bạn có thể nhận được một kế hoạch truy vấn ít hơn tối ưu.
Đúng. Nếu bộ nhớ phục vụ tôi, điều đó sẽ hoạt động. Của chúng tôi bạn có thể sử dụng:
DELETE FROM table WHERE id <> 2
Tôi chỉ đang giải quyết vấn đề này. Nếu bạn sử dụng <> hoặc không có trong một biến, giá trị này là null, nó sẽ dẫn đến sai. Vì vậy, thay vì <> 1, bạn phải kiểm tra nó như sau:
AND (isdelete is NULL or isdelete = 0)
id != NULL
không không làm việc như bạn mong muốn.