SQL WHERE la condizione non è uguale a?


Risposte:


156

Puoi fare così

DELETE FROM table WHERE id NOT IN ( 2 )

O

DELETE FROM table WHERE id <>  2 

Come ha notato @Frank Schmitt, potresti voler stare attento anche ai valori NULL. Se vuoi eliminare tutto ciò che non lo è 2(inclusi i NULL), aggiungi OR id IS NULLalla clausola WHERE.


Ho provato questo comando un paio di volte .. ma non sembrava funzionare finché non mi sono reso conto che DELETE in MySQL non usa * ..
Frank Vilea

Ecco fatto, modificato la risposta per rimuovere il * Grazie per averlo sottolineato.
Praveen Lobo

5
Solo un commento generale per le persone che sono arrivate qui chiedendosi perché != NULLnon funzionano: "Non è possibile utilizzare operatori di confronto aritmetico come =, <o <> per testare NULL." ( dalla documentazione di MySQL ). Quindi questo significa che devi usare IS NOT NULL .
Byson

31

La tua domanda ha già ricevuto risposta dagli altri poster, vorrei solo farti notare

 delete from table where id <> 2

(o sue varianti, non id = 2 ecc.) non eliminerà le righe in cui id è NULL.

Se vuoi eliminare anche le righe con id = NULL:

delete from table where id <> 2 or id is NULL

12
delete from table where id <> 2



modifica: per correggere la sintassi per MySQL


11

Potresti fare quanto segue:

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

1
Funziona bene se il valore non è numerico WHERE NOT (id = 'two');
Kareem


7

Ripensa alla logica formale e all'algebra. Un'espressione come

A & B & (D | E)

può essere negato in due modi:

  • Il modo ovvio:

    !( A & B & ( D | E ) )
  • Quanto sopra può anche essere riformulato, è sufficiente ricordare alcune proprietà delle espressioni logiche:

    • !( A & B )è l'equivalente di (!A | !B).
    • !( A | B )è l'equivalente di (!A & !B).
    • !( !A ) è l'equivalente di (A).

    Distribuisci il NOT (!) Sull'intera espressione a cui si applica, invertendo gli operatori ed eliminando i doppi negativi man mano che procedi:

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

Quindi, in generale, qualsiasi clausola where può essere negata secondo le regole di cui sopra. La negazione di questo

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
               )
         )

o

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

Che è migliore? Questa è una domanda molto sensibile al contesto. Solo tu puoi deciderlo.

Tieni presente, tuttavia, che l'uso di NOT può influenzare ciò che l'ottimizzatore può o non può fare. Potresti ottenere un piano di query non ottimale.


6

WHERE id <> 2 dovrebbe funzionare bene ... è questo che stai cercando?


4

Sì. Se la memoria mi serve, dovrebbe funzionare. Il nostro potresti usare:

DELETE FROM table WHERE id <> 2

3

La soluzione migliore è usare

DELETE FROM table WHERE id NOT IN ( 2 )

0

Stavo solo risolvendo questo problema. Se usi <> o non sei in una variabile, che è nulla, risulterà falso. Quindi invece di <> 1, devi controllarlo in questo modo:

 AND (isdelete is NULL or isdelete = 0)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.