SQL WHERE条件が等しくない?


回答:


155

あなたはこのようにすることができます

DELETE FROM table WHERE id NOT IN ( 2 )

または

DELETE FROM table WHERE id <>  2 

@Frank Schmittが述べたように、NULL値にも注意する必要があるかもしれません。2含まれていないもの(NULLを含む)をすべて削除する場合はOR id IS NULL、WHERE句に追加します。


私は、このコマンドを数回を試してみました..しかし、私はMySQLでのDELETEは、* ..使用していないことを実現するまでそれが動作していないようでした
フランクVilea

それでは、回答を編集して*を指摘していただき、ありがとうございます。
Praveen Lobo、

5
なぜ機能し!= NULLないのかと不思議に思っている人への一般的なコメント:「=、<、<>などの算術比較演算子を使用してNULLをテストすることはできません。」(MySQLドキュメントから)。つまり、を使用 する必要あるということですIS NOT NULL
Byson 2014

31

あなたの質問はすでに他のポスターで答えられています、私はそれを指摘したいのですが

 delete from table where id <> 2

(またはid = 2などではなく、その変形)は、idがNULLである行を削除しません。

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 )

したがって、一般的には、上記の規則に従ってwhere句を否定できます。これの否定

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

3

最良の解決策は使用することです

DELETE FROM table WHERE id NOT IN ( 2 )

0

私はこの問題を解決していました。<>を使用するか、変数にない場合、つまりnullの場合、結果はfalseになります。したがって、<> 1の代わりに、次のようにチェックする必要があります。

 AND (isdelete is NULL or isdelete = 0)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.