4

Oracle 11g データベースに対して JDBC で PreparedStatement クエリを実行していますが、null パラメータを渡した結果が、クエリ自体で「is null」を定義した結果と異なることがわかりました。

たとえば、次のクエリは次のようになります。

String sql = "SELECT col1 FROM tbl WHERE col2 = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setNull(1, java.sql.Types.INTEGER);
ps.execute();

このクエリとは異なります。

String sql = "SELECT col1 FROM tbl WHERE col2 is null";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setNull(1, java.sql.Types.INTEGER);
ps.execute();

なぜそうなるのか、また、「col2 = value」と「col2 is null」の両方のケースをカバーするために 2 つの別々の SQL ステートメントを定義しないようにする方法に興味があります。

4

3 に答える 3

6

これはJavaとは関係ありません。実際、これがOracleでNULLが機能する方法です。

NULL は、何か (NULL と比較しても) 常に false です。IS NULL を使用する必要があります。

これも行を返しません。

SELECT col1 FROM tbl WHERE col2 = NULL

あるいは

SELECT col1 FROM tbl WHERE NULL = NULL
于 2012-06-12T05:02:00.767 に答える
3

これは、データベースに NULL データ値を挿入ps.setNull(1, java.sql.Types.INTEGER)するためのものだと思います。

SQL クエリIS NULLでデータ値を検索する場合に使用する必要があります。NULL

結局のところ、を使用して値をcol2 = NULL比較できないため、実行しても機能しません。NULL=

于 2012-06-12T05:03:43.693 に答える
0

間違いなく Oracle データベースを使用している場合は、次のステートメントを使用できます。NULL も NULL と同じものとして受け入れます。

select col1 from tbl where decode(col2, ?, 1, 0)=1

非常に読みやすいわけではありませんが、上記の表現よりは優れています。また、準備済みステートメントに同じ値を 2 回与えることも避けます。Oracle 11または12で動作します。

于 2020-03-10T09:41:39.743 に答える