[英]Java Prepared Statement with IS NULL
假設我有一個這樣的 MySQL 表:
VARCHAR 100 | VARCHAR 100 | VARCHAR 100
[ID] [姓名] [昵稱] [FAVORITE_COLOR]
1 約翰·約翰尼·紅
2 Eric NULL 綠色
我想在 Java 中使用以下准備好的語句選擇昵稱為 NULL 的第二行:
statement = "SELECT * FROM my_table WHERE name = ? AND nickname = ?"
prepared = connection.prepareStatement(statement)
prepared.setString(1, "Eric")
prepared.setString(2, null)
result = prepared.executeQuery()
此查詢不起作用。 結果集為空。
我試過的另一個選擇是:
statement.setNull(2,java.sql.Types.VARCHAR)
這也不起作用,結果集為空。
最后,我嘗試了一個不同的 SQL,但它顯然是錯誤的並返回了太多行(因為它不夠嚴格):
statement = "SELECT * FROM my_table WHERE name = ? AND (nickname IS NULL) OR (nickname = ?)"
在我的情況下,這選擇了太多行。
所以我的問題是:如何使用 Java PreparedStatement 使用 MySQL 的“IS NULL”選擇一行?
這是眾所周知的 SQL 數據庫限制。 對於大多數數據庫,您必須編寫... WHERE field IS NULL
來測試field
NULL 值。 ... field = NULL
和... field = :param
其中:param
是參數化查詢的參數都不會匹配 NULL 值。
所以唯一的解決方案是明確地寫field IS NULL
是你的查詢。 換句話說,您需要 2 個不同的查詢,一個用於非空值(只有一個參數),另一個用於空值(和 2 個參數)。
statement = "SELECT * FROM my_table WHERE name = ? AND nickname = ?";
statement = "SELECT * FROM my_table WHERE name = ? AND nickname IS NULL";
你可以使用這個技巧(注意 JBNizet 解釋的括號)
statement = "SELECT * FROM my_table WHERE name = ? AND (nickname = ? OR nickname IS NULL)";
如果您仍想對要求 NULL 值的查詢使用 2 個參數。
https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to
NULL 安全的相等。 此運算符執行與 = 運算符類似的相等比較,但如果兩個操作數均為 NULL,則返回 1 而不是 NULL,如果一個操作數為 NULL,則返回 0 而不是 NULL。
<=> 運算符等效於標准 SQL IS NOT DISTINCT FROM 運算符。
為了使 null 起作用,請將您的查詢更新為: statement = "SELECT * FROM my_table WHERE name = ? AND nickname <=> ?"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.