É 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.
!= NULL
nã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 != NULL
se não funcionar como seria de esperar.