web-dev-qa-db-fra.com

Condition SQL WHERE, non égale à?

Est-il possible de nier une clause where?

par exemple.

DELETE * FROM table WHERE id != 2;
83
Frank Vilea

Tu peux faire comme ça

DELETE FROM table WHERE id NOT IN ( 2 )

OR

DELETE FROM table WHERE id <>  2 

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

138
Praveen Lobo

Les autres affiches ont déjà répondu à votre question. J'aimerais simplement souligner que

 delete from table where id <> 2

(ou leurs variantes, 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
29
Frank Schmitt
delete from table where id <> 2



edit: pour corriger la syntaxe de MySQL

12
Fosco

Vous pouvez faire ce qui suit:

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

Utilisez <> pour annuler la clause where.

8
Brandon

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

A & B & (D | E)

peut être annulé de plusieurs manières:

  • Le moyen évident:

    !( A & B & ( D | E ) )
    
  • Ce qui précède peut également être reformulé, il vous suffit de vous rappeler 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).

    Répartissez 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 où peut être annulée conformément aux règles ci-dessus. La négation de cette

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 sensible au contexte. Seulement vous pouvez décider cela.

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.

7
Nicholas Carey

WHERE id <> 2 devrait bien fonctionner ... Est-ce ce que vous recherchez?

6
JNK

Oui. Si ma mémoire est bonne, ça devrait marcher. Notre vous pouvez utiliser:

DELETE FROM table WHERE id <> 2
4
dkruythoff

Je viens de résoudre ce problème. Si vous utilisez <> ou si ne figure pas dans une variable, la valeur est null, le résultat sera false. Donc au lieu de <> 1, vous devez le vérifier comme ceci:

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