SQL เงื่อนไข WHERE ไม่เท่ากับ?


คำตอบ:


160

คุณสามารถทำเช่นนี้

DELETE FROM table WHERE id NOT IN ( 2 )

หรือ

DELETE FROM table WHERE id <>  2 

ดังที่ @Frank Schmitt กล่าวไว้คุณอาจต้องการระมัดระวังเกี่ยวกับค่า NULL ด้วย หากคุณต้องการลบทุกอย่างที่ไม่ใช่2(รวมถึง NULL) OR id IS NULLให้เพิ่มคำสั่ง WHERE


ฉันลองใช้คำสั่งนี้สองสามครั้ง .. แต่ดูเหมือนจะไม่ได้ผลจนกว่าฉันจะรู้ว่า DELETE ใน MySQL ไม่ได้ใช้ * ..
Frank Vilea

เอาล่ะแก้ไขคำตอบเพื่อลบ * ขอบคุณที่ชี้ให้เห็น
Praveen Lobo

5
เป็นเพียงความคิดเห็นทั่วไปสำหรับผู้ที่มาที่นี่ที่สงสัยว่าเหตุใดจึง!= NULLไม่ทำงาน: "คุณไม่สามารถใช้ตัวดำเนินการเปรียบเทียบทางคณิตศาสตร์เช่น =, <, หรือ <> เพื่อทดสอบค่า NULL" ( จากเอกสาร MySQL ) ดังนั้นหมายความว่าคุณต้องใช้ IS NOT NULL
Byson

31

คำถามของคุณได้รับคำตอบจากผู้โพสต์คนอื่น ๆ แล้วฉันแค่อยากจะชี้ให้เห็นว่า

 delete from table where id <> 2

(หรือตัวแปรดังกล่าวไม่ใช่ id = 2 ฯลฯ ) จะไม่ลบแถวที่ id เป็นโมฆะ

หากคุณต้องการลบแถวด้วย id = NULL:

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




7

มองย้อนกลับไปที่ตรรกะที่เป็นทางการและพีชคณิต นิพจน์เช่น

A & B & (D | E)

อาจถูกลบล้างได้สองวิธี:

  • วิธีที่ชัดเจน:

    !( A & B & ( D | E ) )
    
  • ข้างต้นสามารถปรับปรุงใหม่ได้คุณต้องจำคุณสมบัติบางอย่างของนิพจน์เชิงตรรกะ:

    • !( A & B )เทียบเท่ากับ(!A | !B).
    • !( A | B )เทียบเท่ากับ(!A & !B).
    • !( !A ) เทียบเท่ากับ (A)

    แจกแจง NOT (!) ให้ทั่วทั้งนิพจน์ที่ใช้สลับตัวดำเนินการและกำจัดเชิงลบคู่ในขณะที่คุณดำเนินการ:

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

ดังนั้นโดยทั่วไปข้อใด ๆ ที่อาจถูกลบล้างตามกฎข้างต้น การปฏิเสธนี้

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

หรือ

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

แบบไหนดีกว่ากัน? นั่นเป็นคำถามที่คำนึงถึงบริบทมาก คุณเท่านั้นที่จะตัดสินใจได้

อย่างไรก็ตามโปรดทราบว่าการใช้ NOT อาจส่งผลต่อสิ่งที่เครื่องมือเพิ่มประสิทธิภาพสามารถทำได้หรือไม่สามารถทำได้ คุณอาจได้รับแผนการสืบค้นน้อยกว่าที่เหมาะสม


6

WHERE id <> 2 ควรจะทำงานได้ดี ... นั่นคือสิ่งที่คุณหลังจากนั้นหรือไม่?


4

ใช่. ถ้าหน่วยความจำให้บริการฉันก็น่าจะใช้ได้ คุณสามารถใช้:

DELETE FROM table WHERE id <> 2


0

ฉันแค่แก้ปัญหานี้ หากคุณใช้ <> หรือไม่ได้อยู่ในตัวแปรนั่นคือโมฆะจะทำให้เกิดเป็นเท็จ ดังนั้นแทนที่จะเป็น <> 1 คุณต้องตรวจสอบดังนี้:

 AND (isdelete is NULL or isdelete = 0)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.