SQL WHERE условие, не равное?

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

например.

DELETE * FROM table WHERE id != 2;

Ответ 1

Вы можете сделать это следующим образом:

DELETE FROM table WHERE id NOT IN ( 2 )

ИЛИ

DELETE FROM table WHERE id <>  2 

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

Ответ 2

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

 delete from table where id <> 2

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

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

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

Ответ 3

delete from table where id <> 2



edit: чтобы исправить синтаксис MySQL

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

A & B & (D | E)

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

  • Очевидный способ:

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

    • !( A & B ) является эквивалентом (!A | !B).
    • !( A | B ) является эквивалентом (!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 может повлиять на то, что оптимизатор может или не может сделать. Вы можете получить менее оптимальный план запроса.

Ответ 8

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

DELETE FROM table WHERE id <> 2

Ответ 9

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

 AND (isdelete is NULL or isdelete = 0)