带有 IS NULL 的可选参数查询在 Java Sqlite 中无法正常工作

Optional Parameter query with IS NULL not working as expected in Java Sqlite

我有这个 table PropertyDetails,其中包含一列 "bedrooms"。在我的 GUI 中,我有一个过滤器面板,它允许用户 select 卧室数量(1、2、3、4、5、6、7、8、9、10),因此显示使用过滤器的结果。

我正在使用参数化查询将卧室数量作为过滤器传递,该过滤器可以为空。 当我使用 "IS NULL" 时,我的查询没有提供所需的结果,但没有它会显示准确的结果。 当我仅使用此代码时,它工作正常并提供所需的输出:

where
(PropertyDetails.bedrooms=?1)
 OR 
(PropertyDetails.bedrooms=?2)

我已经尝试使用 IN() 子句,但它不允许传入参数(如在互联网上研究的那样)。 尝试组合 AND , OR .

这是我想要 运行 的查询,因为参数可以有空值(可能未选中)。但只有当 1bhk 和 2bhk 都被选中时,它才 returns 预期输出并且仅在任何一个被勾选时显示所有结果。

PreparedStatement stmt=conn.prepareStatement(
"Select * from PropertyDetails
 where
(PropertyDetails.bedrooms=?1 OR ?1 IS NULL)
 OR 
(PropertyDetails.bedrooms=?2 OR ?2 IS NULL)");
        stmt.setString(1,(bhk1));
        stmt.setString(2, bhk2);
        rs=stmt.executeQuery();

最初,

bhk1=null;
bhk2=null;
//If the user checks the 1bhk box, bhk1 string is set to 1 and when the user checks 2bhk box, bhk2 string is set to 2 i.e : 
if(1bhkbox.isSelected())
  bhk1="1";
if(2bhkbox.isSelected())
  bhk2="2";

如果没有过滤器 selected 我想显示所有记录。 如果单个过滤器是 selected,我想显示具有该过滤器 (bhk) 值的所有记录。 如果多个过滤器被 selected(例如:1bhk 和 2 bhk 都被选中),我想显示所有 PropertyDetails.Bedrooms 值为 1 或 2 的记录。 用户可以 select 一间或多间卧室选项或 none。 因此,它可以是NULL,单值或多值。

您应该重写查询:

SELECT * FROM PropertyDetails WHERE bedrooms IN(?1, ?2) OR (?1 IS NULL AND ?2 IS NULL)

解释:

bedrooms IN(?1, ?2)
-- if any parameter is provided then filled one are used

OR (?1 IS NULL AND ?2 IS NULL)
-- none of parameter is provided, show all values