簡體   English   中英

帶有 IS NULL 的 Java 准備語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM