Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有NULL的可选参数查询在Java Sqlite中无法正常工作_Java_Sql_Sqlite_Jdbc_Prepared Statement - Fatal编程技术网

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

带有NULL的可选参数查询在Java Sqlite中无法正常工作,java,sql,sqlite,jdbc,prepared-statement,Java,Sql,Sqlite,Jdbc,Prepared Statement,我有一张包含“卧室”一栏的桌子PropertyDetails。在我的GUI中,我有一个过滤器面板,允许用户选择卧室的数量(1,2,3,4,5,6,7,8,9,10),从而显示过滤器的结果 我使用参数化查询将卧室数作为一个可以为空的过滤器传递。 当我使用“IS NULL”时,我的查询不提供所需的结果,但在没有它的情况下显示准确的结果。 当我仅使用此代码时,它工作正常,并提供所需的输出: where (PropertyDetails.bedrooms=?1) OR (PropertyDetail

我有一张包含“卧室”一栏的桌子PropertyDetails。在我的GUI中,我有一个过滤器面板,允许用户选择卧室的数量(1,2,3,4,5,6,7,8,9,10),从而显示过滤器的结果

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

where
(PropertyDetails.bedrooms=?1)
 OR 
(PropertyDetails.bedrooms=?2)
我已经尝试过使用IN()子句,但它不允许传入参数(正如互联网上研究的那样)。 尝试了和、或的组合

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

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";
如果未选择任何筛选器,我希望显示所有记录。 如果选择了单个筛选器,我希望显示具有该筛选器(bhk)值的所有记录。 如果选择了多个过滤器(例如:1bhk和2 bhk都被选中),我想显示PropertyDetails.Beddrooms值为1或2的所有记录。 用户可以选择一个或多个卧室选项,也可以不选择。
因此,它可以是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

您应该重写查询:

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


您总是将字符串值绑定到参数;它们怎么可能为空?我的坏,Edited.JDBC不使用
?1
作为参数占位符。只有
您使用什么框架来访问database.jdbc和sqlite。它工作正常,没有任何错误。@a_horse_与_no_名称它可能是一个非标准扩展名。虽然JDBC只定义了对位置占位符的支持,但从技术上讲,支持索引占位符并不是“禁止的”;它们怎么可能为空?我的坏,Edited.JDBC不使用
?1
作为参数占位符。只有
您使用什么框架来访问database.jdbc和sqlite。它工作正常,没有任何错误。@a_horse_与_no_名称它可能是一个非标准扩展名。虽然JDBC只定义了对位置
占位符的支持,但从技术上讲,支持索引占位符并不是“禁止”的。当我选择1bhk、2bhk或两者中的任何一个时,这项功能都可以正常工作,但当我没有选择任何筛选器时,它应该显示所有结果,但在这种情况下,如果我没有检查任何筛选器(1bhk或2bhk)然后它没有显示任何结果。
如果我没有检查任何筛选器(1bhk或2bhk),那么它就没有显示任何结果。
不可能:
或(?1为NULL,2为NULL)
这意味着你传递的不是
NULL
可能是空字符串
'
重新格式化了查询,并且它工作了,不确定原因(请解释逻辑及其工作原理):'where(?2为空,而?3为空)或(propertydeails.beddrooms IN(?2,?3));'where(propertydeails.beddrooms=?12或?12为空),您也能解释一下为什么'where(propertydeails.beddrooms=?12或?12为空)`不起作用。当我选择1bhk、2bhk或两者中的任何一个时,该选项运行良好,但当我未选择任何筛选器时,它应显示所有结果,但在这种情况下,如果我未检查任何筛选器(1bhk或2bhk),则它不会显示任何结果。
如果我未检查任何筛选器(1bhk或2bhk)然后它不会显示任何结果。
不可能:
或(?1为NULL,2为NULL)
这意味着您传递的不是
NULL
可能是空字符串
将查询重新格式化为,它工作了,不确定原因(请解释逻辑和它工作的原因):`where(?2为NULL,3为NULL)或(PropertyDetails.Beddrooms IN(?2,?3));“你能解释一下为什么‘where(PropertyDetails.Beddrooms=?12或?12为空)’不起作用吗。