2

次のクエリが Derby で失敗する理由を知っている人はいますか?

delete from MyTable
where
((null = null) or (col1 = null)) OR
((102 = null) or (col2 = 102)))

次のエラーが表示されます。

Error: Syntax error: Encountered "null" at line 3, column 3.
SQLState:  42X01
ErrorCode: -1

SQLは、iBatis ORMレイヤー構成に書き込んだSQLに基づいてJavaプログラムで生成されています。準備されたステートメントは次のとおりです。

delete from MyTable
where
((? = null) or (col1 = ?)) OR
((? = null) or (col2 = ?)))

ご覧のとおり、私が言おうとしているのは、パラメーターが null でない場合、列の値をパラメーターに対してテストするということです。

4

4 に答える 4

3

あなたが望むものは次のとおりだと思います:

DELETE FROM `name_of_table` WHERE `name_of_column` IS NULL

=valueSQL には、NULL を除くほとんどの値で使用できるこの非常に奇妙なプロパティがあります。

于 2010-03-21T09:09:00.157 に答える
2

SQL では、引数の 1 つが である演算子は にNULL評価されNULLます。そう1 + NULLですNULLMAX(NULL)ですNULL、などです。最も重要なことは、あなたの場合、X がそれ自体であっても (つまり、notと評価される)、X = NULL 常に と評価されることです。NULLNULLNULL = NULLNULLtrue

正確なエラーNULLは、比較の左側でキーワードが実際には有効でないということです。しかし、それを修正したとしても、一致する行がないことがわかります。他の人が言ったように、何かがnullかどうかを判断しようとするときに使用する正しい比較はIS NULL、のようにX IS NULLです。

于 2010-03-21T09:27:04.317 に答える
1

where 句の最初の部分は、すべての行に一致する必要があることを示唆しています (null = null真であると予想される場合、一般的に SQL ではそうではありません) - 本当にテーブル全体の内容を削除しますか? 同様102 = nullに、102 という列を何らかの方法で取得していない限り (少なくとも禁止されていることを願っています)、かなり奇妙な種類の比較です。

あなたは実際に何を一致させようとしていますか?他の人が言ったように、「is null」を使用して値を null と比較する必要がありますが、クエリにはかなり大きな問題があるようです。何を達成しようとしているのかを教えていただければ、より適切なクエリを作成するお手伝いができるかもしれません。

于 2010-03-21T09:09:54.703 に答える
0

うーん、まだ良い答えが得られていないようですか?NULLDerby の値の処理にも同様の問題があります。

Derby の NULL 値の処理

実際のところ、Derby には NULL に関連付けられた型が必要です。SQL を自分で書いた場合にあなたがしなければならないことは、cast(null to int)またはそのようなことです。残念ながら、おっしゃる通り、SQLはiBATISで生成されているので、アップグレードすればうまくいくのではないでしょうか?それまでの間、iBATIS はこれに対する修正を作成しましたか?

それ以外の場合は、これが役立つ場合があります。

http://anydoby.com/jblog/en/java/143

于 2011-02-05T09:46:16.117 に答える