SQL ГДЕ условие, не равное? - PullRequest
83 голосов
/ 27 мая 2011

Можно ли отменить предложение where?

например,

DELETE * FROM table WHERE id != 2;

Ответы [ 9 ]

137 голосов
/ 27 мая 2011

Вы можете сделать это

DELETE FROM table WHERE id NOT IN ( 2 )

ИЛИ

DELETE FROM table WHERE id <>  2 

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

29 голосов
/ 28 мая 2011

На ваш вопрос уже отвечали другие авторы, я просто хотел бы отметить, что

 delete from table where id <> 2

(или его варианты, а не id = 2 и т. Д.) Не будут удалять строки, где id равен NULL.

Если вы также хотите удалить строки с id = NULL:

delete from table where id <> 2 or id is NULL
12 голосов
/ 27 мая 2011
delete from table where id <> 2



изменить: исправить синтаксис для MySQL

11 голосов
/ 27 мая 2011

Вы можете сделать следующее:

DELETE * FROM table WHERE NOT(id = 2);
8 голосов
/ 27 мая 2011

Используйте <> для отмены предложения where.

7 голосов
/ 28 мая 2011

Оглянись на формальную логику и алгебру.Выражение типа

A & B & (D | E)

может быть отменено несколькими способами:

  • Очевидный путь:

    !( A & B & ( D | E ) )
    
  • Вышесказанное также можно переформулировать, вам просто нужно запомнить некоторые свойства логических выражений:

    • !( A & B ) эквивалентно (!A | !B).
    • !( A | B ) isэквивалент (!A & !B).
    • !( !A ) является эквивалентом (A).

    Распределить NOT (!) по всему выражению, к которому он применяется, инвертируя операторыи устранение двойных негативов по мере продвижения:

        !A | !B | ( !D & !E )
    

Таким образом, в общем случае любое условие where может быть отменено в соответствии с вышеуказанными правилами.Отрицание этого

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 голосов
/ 27 мая 2011

WHERE id <> 2 должно работать нормально ... Это то, что вам нужно?

4 голосов
/ 27 мая 2011

Да. Если мне не изменяет память, это должно сработать. Наши вы можете использовать:

DELETE FROM table WHERE id <> 2
0 голосов
/ 24 октября 2016

Я только что решил эту проблему.Если вы используете <> или не используете переменную, то есть NULL, это приведет к false.Поэтому вместо <> 1 вы должны проверить это так:

 AND (isdelete is NULL or isdelete = 0)
...