¿Es posible negar una cláusula where?
p.ej
DELETE * FROM table WHERE id != 2;
Respuestas:
Puedes hacer esto
DELETE FROM table WHERE id NOT IN ( 2 )
O
DELETE FROM table WHERE id <> 2
Como señaló @Frank Schmitt, es posible que también desee tener cuidado con los valores NULL. Si desea eliminar todo lo que no lo es 2
(incluidos los NULL), agregue OR id IS NULL
a la cláusula WHERE.
!= NULL
no funcionan: "No puede usar operadores de comparación aritmética como =, <o <> para probar NULL". ( de la documentación de MySQL ). Eso significa que tienes que usar IS NOT NULL
.
Tu pregunta ya fue respondida por los otros carteles, solo me gustaría señalar que
delete from table where id <> 2
(o variantes de los mismos, no id = 2, etc.) no eliminará filas donde id es NULL.
Si también desea eliminar filas con id = NULL:
delete from table where id <> 2 or id is NULL
Podrías hacer lo siguiente:
DELETE * FROM table WHERE NOT(id = 2);
Mira hacia atrás a la lógica formal y al álgebra. Una expresión como
A & B & (D | E)
se puede negar de dos maneras:
La forma obvia:
!( A & B & ( D | E ) )
Lo anterior también se puede reformular, solo necesita recordar algunas propiedades de las expresiones lógicas:
!( A & B )
es el equivalente de (!A | !B)
.!( A | B )
es el equivalente de (!A & !B)
.!( !A )
es el equivalente de (A).Distribuya el NOT (!) En toda la expresión a la que se aplica, invirtiendo los operadores y eliminando los dobles negativos a medida que avanza:
!A | !B | ( !D & !E )
Entonces, en general, cualquier cláusula where puede ser negada de acuerdo con las reglas anteriores. La negación de este
select *
from foo
where test-1
and test-2
and ( test-3
OR test-4
)
es
select *
from foo
where NOT( test-1
and test-2
and ( test-3
OR test-4
)
)
o
select *
from foo
where not test-1
OR not test-2
OR ( not test-3
and not test-4
)
¿Cual es mejor? Esa es una pregunta muy sensible al contexto. Solo tú puedes decidir eso.
Sin embargo, tenga en cuenta que el uso de NOT puede afectar lo que el optimizador puede o no puede hacer. Es posible que obtenga un plan de consulta menos que óptimo.
Si. Si la memoria no me falla, debería funcionar. Nuestro podría utilizar:
DELETE FROM table WHERE id <> 2
Solo estaba resolviendo este problema. Si usa <> o no está dentro de una variable, eso es nulo, resultará en falso. Entonces, en lugar de <> 1, debe marcarlo así:
AND (isdelete is NULL or isdelete = 0)
id != NULL
no no funcionará como se espera.