2012-08-14 56 views
1

MySQL使用「IS NULL」而不是「NULL」,所以我如何綁定變量來實現相同?在JAVA中爲MySQL PreparedStatment綁定NULL?

現在,我試圖與此

selectStmt.setNull(2, java.sql.Types.VARCHAR); 

當我印刷 「java.sql.Types.VARCHAR」 表示值= 12?如果是的話,這是如何在預先準備好的情況下設置「IS NULL」的?

更多細節:

即我感興趣的查詢(MySQL的)爲空,如果我有字符串=「」輸入。因此,邏輯是這樣的,

Connection c = SQLCon.connect(); 
PreparedStatement selectStmt = c.prepareStatement("select * from " 
            + TableName 
            + " where P = ? AND M = ? AND PR = ? AND DR = ? "); 


if (P.trim().equals("")) 
{ 
    selectStmt.setNull(1, java.sql.Types.VARCHAR); 
} else 
{ 
    selectStmt.setString(1, P); 
} 

if (M.trim().equals("")) 
{ 
    selectStmt.setNull(2, java.sql.Types.VARCHAR); 
} else 
{ 
    selectStmt.setString(2, M); 
} 

請指點

+2

那的確是你如何設置第二個綁定變量設置爲null,如果它是一個VARCHAR列。你的問題是什麼? – 2012-08-14 22:04:15

+0

@PaulTomblin:它是varchar列,但查詢沒有取得我需要的結果。 – 2012-08-14 22:09:55

+1

不要爲null使用空字符串。對null使用null。他們是兩個完全不同的動物。 – 2012-08-15 11:28:43

回答

6

如果要匹配where子句中可能爲null的列和可能爲null的參數,實際上需要將它綁定兩次,因爲在SQL中,null不等於其他任何值,甚至另一個null 。

PreparedStatement stmt = conn.prepareStatement("select * from foo where (? is null and bar is null) or (bar = ?)"); 
col = 1; 
setVarchar(stmt, col++, var); 
setVarchar(stmt, col++, var); 

void setVarchar(PreparedStatement stmt, int col, String var) 
{ 
    if (var == null) 
    stmt.setNull(col, java.sql.Types.VARCHAR); 
    else 
    stmt.setString(col, var); 
} 
+0

您也可以使用WHERE IFNULL(?, - 1)= IFNULL(bar,-1)。將-1替換爲不應出現在數據或綁定變量中的適當值。 – 2015-10-12 13:30:56

2

這似乎很奇怪,但你這樣做:

if (variable == null) { 
    selectStmt.setNull(2, java.sql.Types.VARCHAR); 
} else { 
    ... 
} 

這背後的原因是因爲NULL是在數據庫中的值,而不是Java中的值爲null。有時,您需要區分從數據庫中取回NULL而不是從數據庫中取回任何東西。

+0

感謝somereason它沒有爲我工作 – 2012-08-15 21:43:07

+0

然後檢查基本知識。也許你有錯誤的'java.sql.Types。***'數據類型,你已經丟失或丟失了你的數據庫連接,你沒有帶兩個參數的selectStmt,或者你沒有創建selectStmt。相信我,「setNull」是在數據庫中存儲「NULL」的正確方法,而在java端'variable == null'是檢查變量是否沒有引用的正確方法。 – 2012-08-15 22:04:49

0

它是一個XML輸入和UI的用戶看到空白NULL,因此發送空白輸入

if (P.trim().equals("")) 
    { 
    sql += "P IS NULL"; 
    } 
    else 
    { 
    sql += "P = ?"; 
    } 

PreparedStatement selectStmt = c.prepareStatement(sql); 

int i = 1; 
// used to prevent index out of range issues 

// Binding values for non-null strings ONLY 
if (!(P.trim().equals(""))) 
    { 
    selectStmt.setString(i, P); 
    i++; 
    } 
相關問題