2012-06-12 41 views
3

我正在使用JDBC對Oracle 11g數據庫進行PreparedStatement查詢,並發現傳遞null參數的結果與定義「is null」的結果不同查詢自己。JDBC setNull()與Oracle「空」會產生不同的結果

例如,這個查詢:

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

我很好奇,爲什麼是這樣的話,我怎麼能避免定義兩個單獨的SQL語句來覆蓋「col2 = value」和「col2爲null」的情況。

+1

NULL值進行比較,我似乎無法找到一個更清潔的方式來解決這個不是詳細[這裏]答案(HTTP://計算器.com/questions/4215135/how-to-deal-with-maybe-null-values-in-a-preparedstatement?rq = 1),這將是「WHERE col2 =?OR(col2 IS NULL AND?IS NULL) 」。 –

回答

6

這與Java無關,真的,這是NULL如何在Oracle中工作。

與任何東西(甚至爲NULL)相比,NULL始終爲假,您必須使用IS NULL。

這也將不返回行:

SELECT col1 FROM tbl WHERE col2 = NULL 

甚至

SELECT col1 FROM tbl WHERE NULL = NULL 
+0

有沒有辦法在單個SQL語句中有條件地表達這種情況? –

+0

你的意思是,如何使它在Oracle和其他數據庫中工作,而不用更改SQL語句,或者如何編寫一個語句來查找空值或非空值? – Bill

+1

如何編寫一個基於參數輸入查找空值或非空值的語句。添加「WHERE col2 =?OR(col2 IS NULL AND?IS NULL)」似乎是最明智的選擇,要求我提供變量兩次優於定義和維護兩個單獨的查詢。有沒有更好的選擇? –

2

我相信ps.setNull(1, java.sql.Types.INTEGER)是爲那些插入 NULL數據值到數據庫中。

如果您在SQL查詢中搜索NULL數據值,則應使用IS NULL

畢竟,做col2 = NULL將無法​​工作或者是因爲你不能使用=

+0

如果我想在一種情況下搜索NULL或在另一種情況下搜索非空值,但我想根據輸入參數進行操作? –

+0

使用if-else語句。 如果(價值== NULL){// 使用SQL查詢 }其他{// 使用另一個SQL查詢 } –

+0

我試圖避免定義查詢多次,因爲它是一個更復雜的查詢和重新定義它會增加未來的維護頭痛。沿着「WHERE col2 =?OR(col2 IS NULL AND?IS NULL)」的語句向查詢添加邏輯應該是有用的。 –