Чи можна заперечити речення where?
напр
DELETE * FROM table WHERE id != 2;
Відповіді:
Ви можете зробити так
DELETE FROM table WHERE id NOT IN ( 2 )
АБО
DELETE FROM table WHERE id <> 2
Як зазначав @Frank Schmitt, можливо, ви також захочете бути обережними щодо значень NULL. Якщо ви хочете видалити все, що не є 2
(включаючи NULL), додайте OR id IS NULL
до речення WHERE.
!= NULL
роботи не працюють: "Ви не можете використовувати арифметичні оператори порівняння, такі як =, <або <>, щоб перевірити на НУЛЬ." ( з документації MySQL ). Отже, це означає, що вам доведеться використовувати IS NOT NULL
.
На ваше запитання вже відповіли інші афіші, я хотів би лише зазначити це
delete from table where id <> 2
(або їх варіанти, не id = 2 тощо) не видалятимуть рядки, де id дорівнює NULL.
Якщо ви також хочете видалити рядки з id = NULL:
delete from table where id <> 2 or id is NULL
Зверніться до формальної логіки та алгебри. Вираз типу
A & B & (D | E)
може бути заперечено кількома способами:
Очевидний спосіб:
!( A & B & ( D | E ) )
Вищезазначене також може бути перероблено, вам просто потрібно запам'ятати деякі властивості логічних виразів:
!( A & B )
є еквівалентом (!A | !B)
.!( A | B )
є еквівалентом (!A & !B)
.!( !A )
є еквівалентом (A).Розподіліть NOT (!) По всьому виразу, до якого воно застосовується, інвертуючи оператори та усуваючи подвійні негативи під час руху:
!A | !B | ( !D & !E )
Отже, загалом будь-яке застереження де може бути заперечене відповідно до вищезазначених правил. Заперечення цього
select *
from foo
where test-1
and test-2
and ( test-3
OR test-4
)
є
select *
from foo
where NOT( test-1
and test-2
and ( test-3
OR test-4
)
)
або
select *
from foo
where not test-1
OR not test-2
OR ( not test-3
and not test-4
)
Який краще? Це дуже контекстне питання. Тільки ви можете вирішити це.
Однак майте на увазі, що використання NOT може впливати на те, що може чи не може робити оптимізатор. Ви можете отримати менш оптимальний план запитів.
Так. Якщо пам'ять мене не зраджує, це має спрацювати. Наші ви могли б використовувати:
DELETE FROM table WHERE id <> 2
Я просто вирішував цю проблему. Якщо ви використовуєте <> або не входить у змінну, тобто значення null, це призведе до значення false. Отже, замість <> 1, ви повинні перевірити це так:
AND (isdelete is NULL or isdelete = 0)
id != NULL
працює не так, як ви очікували.