SQL WHERE condición no es igual a?


Respuestas:


159

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 NULLa la cláusula WHERE.


Probé este comando un par de veces ... pero no pareció funcionar hasta que me di cuenta de que DELETE en MySQL no usa el * ..
Frank Vilea

Ahí lo tienes, editó la respuesta para eliminar el * Gracias por señalar.
Praveen Lobo

5
Solo un comentario general para las personas que llegaron aquí y se preguntaron por qué != NULLno 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 .
Byson

31

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

12
delete from table where id <> 2



editar: para corregir la sintaxis de MySQL


12

Podrías hacer lo siguiente:

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

1
Funciona bien si el valor no es numérico DONDE NO (id = 'dos');
Kareem


7

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.


6

WHERE id <> 2 debería funcionar bien ... ¿Es eso lo que buscas?


4

Si. Si la memoria no me falla, debería funcionar. Nuestro podría utilizar:

DELETE FROM table WHERE id <> 2

3

La mejor solución es usar

DELETE FROM table WHERE id NOT IN ( 2 )

0

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.