A condição SQL WHERE não é igual a?


Respostas:


156

Você pode fazer assim

DELETE FROM table WHERE id NOT IN ( 2 )

OU

DELETE FROM table WHERE id <>  2 

Como @Frank Schmitt observou, você pode querer ter cuidado com os valores NULL também. Se você deseja excluir tudo o que não é 2(incluindo os NULLs), adicione OR id IS NULLà cláusula WHERE.


Tentei este comando algumas vezes .. mas não parecia funcionar até que percebi que DELETE no MySQL não usa o * ..
Frank Vilea

Pronto, editou a resposta para remover o * Obrigado por apontar.
Praveen Lobo

5
Apenas um comentário geral para pessoas que chegaram aqui se perguntando por que != NULLnão estão funcionando: "Você não pode usar operadores de comparação aritmética como =, <ou <> para testar NULL." ( da documentação do MySQL ). Isso significa que você precisa usar IS NOT NULL .
Byson de

31

Sua pergunta já foi respondida pelos outros participantes, gostaria apenas de ressaltar que

 delete from table where id <> 2

(ou suas variantes, não id = 2 etc.) não excluirá linhas onde id é NULL.

Se você também deseja excluir linhas com id = NULL:

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

12
delete from table where id <> 2



editar: para corrigir a sintaxe do MySQL


11

Você pode fazer o seguinte:

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

1
Funciona bem se o valor não for numérico WHERE NOT (id = 'two');
Kareem


7

Reveja a lógica formal e a álgebra. Uma expressão como

A & B & (D | E)

pode ser negado de duas maneiras:

  • A maneira óbvia:

    !( A & B & ( D | E ) )
  • O acima também pode ser reafirmado, você só precisa se lembrar de algumas propriedades das expressões lógicas:

    • !( A & B )é o equivalente a (!A | !B).
    • !( A | B )é o equivalente a (!A & !B).
    • !( !A ) é equivalente a (A).

    Distribua o NOT (!) Em toda a expressão à qual se aplica, invertendo os operadores e eliminando os negativos duplos à medida que avança:

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

Portanto, em geral, qualquer cláusula where pode ser negada de acordo com as regras acima. A negação disso

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
               )
         )

ou

select *
from foo
where        not test-1
  OR         not test-2
  OR   (     not test-3
         and not test-4
       )

Qual é melhor? Essa é uma questão muito sensível ao contexto. Só você pode decidir isso.

Esteja ciente, porém, de que o uso de NOT pode afetar o que o otimizador pode ou não fazer. Você pode obter um plano de consulta inferior ao ideal.


6

WHERE id <> 2 deve funcionar bem ... É isso que você está procurando?


4

Sim. Se a memória não me falha, isso deve funcionar. Nosso você poderia usar:

DELETE FROM table WHERE id <> 2

3

A melhor solução é usar

DELETE FROM table WHERE id NOT IN ( 2 )

0

Eu estava apenas resolvendo esse problema. Se você usar <> ou não estiver em uma variável, isso é nulo, resultará em falso. Então, em vez de <> 1, você deve marcar assim:

 AND (isdelete is NULL or isdelete = 0)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.