SQL WHERE умова не дорівнює?


Відповіді:


158

Ви можете зробити так

DELETE FROM table WHERE id NOT IN ( 2 )

АБО

DELETE FROM table WHERE id <>  2 

Як зазначав @Frank Schmitt, можливо, ви також захочете бути обережними щодо значень NULL. Якщо ви хочете видалити все, що не є 2(включаючи NULL), додайте OR id IS NULLдо речення WHERE.


Я пробував цю команду кілька разів .. але, здавалося, це не спрацювало, поки не зрозумів, що DELETE у MySQL не використовує * ..
Френк Вілеа,

Ось, ви відредагували відповідь, щоб видалити * Дякуємо за вказівку.
Правен Лобо,

5
Просто загальний коментар для людей, які потрапили сюди, дивуючись, чому їхні != NULLроботи не працюють: "Ви не можете використовувати арифметичні оператори порівняння, такі як =, <або <>, щоб перевірити на НУЛЬ." ( з документації MySQL ). Отже, це означає, що вам доведеться використовувати IS NOT NULL .
Byson

31

На ваше запитання вже відповіли інші афіші, я хотів би лише зазначити це

 delete from table where id <> 2

(або їх варіанти, не id = 2 тощо) не видалятимуть рядки, де id дорівнює NULL.

Якщо ви також хочете видалити рядки з id = NULL:

delete from table where id <> 2 or id is NULL

12
delete from table where id <> 2



редагувати: виправити синтаксис для MySQL


11

Ви можете зробити наступне:

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

1
Добре працює, якщо значення не є числовим WHERE NOT (id = 'two');
Карім


7

Зверніться до формальної логіки та алгебри. Вираз типу

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 може впливати на те, що може чи не може робити оптимізатор. Ви можете отримати менш оптимальний план запитів.


6

WHERE id <> 2 має працювати нормально ... Це те, чим ви займаєтесь?


4

Так. Якщо пам'ять мене не зраджує, це має спрацювати. Наші ви могли б використовувати:

DELETE FROM table WHERE id <> 2

3

Найкраще рішення - використовувати

DELETE FROM table WHERE id NOT IN ( 2 )

0

Я просто вирішував цю проблему. Якщо ви використовуєте <> або не входить у змінну, тобто значення null, це призведе до значення false. Отже, замість <> 1, ви повинні перевірити це так:

 AND (isdelete is NULL or isdelete = 0)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.