Kondisi SQL WHERE tidak sama dengan?


Jawaban:


161

Anda bisa melakukan seperti ini

DELETE FROM table WHERE id NOT IN ( 2 )

ATAU

DELETE FROM table WHERE id <>  2 

Seperti yang dicatat oleh @Frank Schmitt, Anda mungkin ingin berhati-hati dengan nilai NULL juga. Jika Anda ingin menghapus semua yang tidak 2(termasuk NULL), tambahkan OR id IS NULLklausa WHERE.


Saya mencoba perintah ini beberapa kali .. tetapi sepertinya tidak berhasil sampai saya menyadari bahwa DELETE di MySQL tidak menggunakan * ..
Frank Vilea

Ini dia, mengedit jawaban untuk menghapus * Terima kasih telah menunjukkan.
Praveen Lobo

5
Hanya komentar umum untuk orang-orang yang bertanya-tanya mengapa mereka != NULLtidak berfungsi: "Anda tidak dapat menggunakan operator perbandingan aritmatika seperti =, <, atau <> untuk menguji NULL." ( dari dokumentasi MySQL ). Jadi itu artinya Anda harus menggunakan IS NOT NULL .
Byson

31

Pertanyaan Anda sudah dijawab oleh poster lain, saya hanya ingin menunjukkannya

 delete from table where id <> 2

(atau variannya, bukan id = 2 dll) tidak akan menghapus baris di mana id adalah NULL.

Jika Anda juga ingin menghapus baris dengan id = NULL:

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

12
delete from table where id <> 2



edit: untuk memperbaiki sintaks MySQL


12

Anda dapat melakukan hal berikut:

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

1
Berfungsi dengan baik jika nilainya bukan numerik WHERE NOT (id = 'two');
Kareem


7

Lihat kembali logika formal dan aljabar. Ekspresi seperti

A & B & (D | E)

dapat dinegasikan dengan beberapa cara:

  • Cara yang jelas:

    !( A & B & ( D | E ) )
    
  • Hal di atas juga dapat disajikan kembali, Anda hanya perlu mengingat beberapa properti ekspresi logis:

    • !( A & B )setara dengan (!A | !B).
    • !( A | B )setara dengan (!A & !B).
    • !( !A ) setara dengan (A).

    Distribusikan NOT (!) Di seluruh ekspresi yang diterapkan, membalikkan operator dan menghilangkan negatif ganda saat Anda melanjutkan:

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

Jadi, secara umum, klausa mana saja dapat dinegasikan menurut aturan di atas. Penolakan ini

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

adalah

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

atau

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

Mana yang lebih baik? Itu pertanyaan yang sangat sensitif konteks. Hanya Anda yang bisa memutuskan itu.

Namun, ketahuilah bahwa penggunaan TIDAK dapat memengaruhi apa yang dapat atau tidak dapat dilakukan oleh pengoptimal. Anda mungkin mendapatkan paket kueri yang kurang optimal.


6

WHERE id <> 2 seharusnya bekerja dengan baik ... Itukah yang Anda kejar?


4

Iya. Jika ingatanku, itu seharusnya berhasil. Kami, Anda dapat menggunakan:

DELETE FROM table WHERE id <> 2

3

Solusi terbaik adalah menggunakan

DELETE FROM table WHERE id NOT IN ( 2 )

0

Saya baru saja memecahkan masalah ini. Jika Anda menggunakan <> atau tidak dalam variabel, yaitu null, maka akan menghasilkan false. Jadi alih-alih <> 1, Anda harus memeriksanya seperti ini:

 AND (isdelete is NULL or isdelete = 0)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.