La condition SQL WHERE n'est pas égale à?

93

Est-il possible d'annuler une clause where?

par exemple

DELETE * FROM table WHERE id != 2;
Frank Vilea
la source
4
FYI, id != NULLne fonctionne pas comme prévu.
Joshua Pinter le

Réponses:

158

Tu peux faire comme ça

DELETE FROM table WHERE id NOT IN ( 2 )

OU

DELETE FROM table WHERE id <>  2 

Comme @Frank Schmitt l'a noté, vous voudrez peut-être également faire attention aux valeurs NULL. Si vous souhaitez supprimer tout ce qui ne l'est pas 2(y compris les NULL), ajoutez OR id IS NULLà la clause WHERE.

Praveen Lobo
la source
J'ai essayé cette commande plusieurs fois ... mais cela n'a pas semblé fonctionner jusqu'à ce que je réalise que DELETE dans MySQL n'utilise pas le * ..
Frank Vilea
Là vous allez, édité la réponse pour supprimer le * Merci d'avoir souligné.
Praveen Lobo
5
Juste un commentaire général pour les personnes qui sont arrivées ici se demandant pourquoi leur != NULLne fonctionne pas: "Vous ne pouvez pas utiliser d'opérateurs de comparaison arithmétique tels que =, <ou <> pour tester NULL." (à partir de la documentation MySQL ). Cela signifie donc que vous devez utiliser IS NOT NULL .
Byson
31

Votre question a déjà été répondue par les autres affiches, je voudrais juste souligner que

 delete from table where id <> 2

(ou des variantes de celui-ci, pas id = 2, etc.) ne supprimera pas les lignes où id est NULL.

Si vous souhaitez également supprimer des lignes avec id = NULL:

delete from table where id <> 2 or id is NULL
Frank Schmitt
la source
12
delete from table where id <> 2



edit: pour corriger la syntaxe de MySQL

Fosco
la source
11

Vous pouvez faire ce qui suit:

DELETE * FROM table WHERE NOT(id = 2);
Magicien
la source
1
Fonctionne bien si la valeur n'est pas numérique WHERE NOT (id = 'two');
Kareem
9

Utilisez <>pour annuler la clause where.

Brandon
la source
7

Revenez à la logique formelle et à l'algèbre. Une expression comme

A & B & (D | E)

peut être annulé de plusieurs manières:

  • La manière évidente:

    !( A & B & ( D | E ) )
  • Ce qui précède peut également être reformulé, il vous suffit de vous souvenir de certaines propriétés des expressions logiques:

    • !( A & B )est l'équivalent de (!A | !B).
    • !( A | B )est l'équivalent de (!A & !B).
    • !( !A ) est l'équivalent de (A).

    Distribuez le NOT (!) Sur toute l'expression à laquelle il s'applique, en inversant les opérateurs et en éliminant les doubles négatifs au fur et à mesure:

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

Ainsi, en général, toute clause where peut être annulée selon les règles ci-dessus. La négation de cela

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

est

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
       )

Ce qui est mieux? C'est une question très contextuelle. Vous seul pouvez en décider.

Sachez cependant que l'utilisation de NOT peut affecter ce que l'optimiseur peut ou ne peut pas faire. Vous pourriez obtenir un plan de requête moins qu'optimal.

Nicolas Carey
la source
6

WHERE id <> 2 devrait fonctionner correctement ... C'est ce que vous recherchez?

JNK
la source
4

Oui. Si ma mémoire est bonne, cela devrait fonctionner. Notre vous pouvez utiliser:

DELETE FROM table WHERE id <> 2
Dkruythoff
la source
3

La meilleure solution est d'utiliser

DELETE FROM table WHERE id NOT IN ( 2 )
trusha
la source
0

J'étais juste en train de résoudre ce problème. Si vous utilisez <> ou si vous n'êtes pas sur une variable, c'est-à-dire null, il en résultera faux. Donc au lieu de <> 1, vous devez le vérifier comme ceci:

 AND (isdelete is NULL or isdelete = 0)
user2956206
la source