104

where句を無効にすることは可能ですか?

例えば

DELETE * FROM table WHERE id != 2;
4

10 に答える 10

172

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

DELETE FROM table WHERE id NOT IN ( 2 )

また

DELETE FROM table WHERE id <>  2 

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

于 2011-05-27T19:47:24.007 に答える
32

あなたの質問は他の投稿者によってすでに回答されています。

 delete from table where id <> 2

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

id = NULL の行も削除する場合:

delete from table where id <> 2 or id is NULL
于 2011-05-27T20:10:27.907 に答える
13

次のことができます。

DELETE * FROM table WHERE NOT(id = 2);
于 2011-05-27T19:47:33.493 に答える
12
delete from table where id <> 2



編集:MySQLの構文を修正する

于 2011-05-27T19:47:19.057 に答える
9

<>where句を無効にするために使用します。

于 2011-05-27T19:47:32.410 に答える
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 を使用すると、オプティマイザーができることとできないことに影響する可能性があることに注意してください。最適ではないクエリ プランが得られる可能性があります。

于 2011-05-27T20:05:08.113 に答える
6

WHERE id <> 2うまくいくはずです...それはあなたが求めているものですか?

于 2011-05-27T19:47:56.210 に答える
4

はい。記憶が私に役立つなら、それはうまくいくはずです。私たちのあなたが使うことができます:

DELETE FROM table WHERE id <> 2
于 2011-05-27T19:48:03.893 に答える
0

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

 AND (isdelete is NULL or isdelete = 0)
于 2016-10-24T11:32:53.087 に答える