É possível negar uma cláusula where?
por exemplo
DELETE * FROM table WHERE id != 2;
É possível negar uma cláusula where?
por exemplo
DELETE * FROM table WHERE id != 2;
Respostas:
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.
!= 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 .
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
Você pode fazer o seguinte:
DELETE * FROM table WHERE NOT(id = 2);
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.
Sim. Se a memória não me falha, isso deve funcionar. Nosso você poderia usar:
DELETE FROM table WHERE id <> 2
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)
id != NULLse não funcionar como seria de esperar.