我在Postgres 9.0数据库中有一个简单的表:
create table test (id int not null, value int);
我已用几行填充它:
insert into test values (1, 1);
insert into test values (2, null);
insert into test values (3, null);
insert into test values (4, 1);
现在我正在尝试用JDBC阅读它。当我选择value
列中的非空值时,一切都很好:
PreparedStatement select = c.prepareStatement("select * from test where value=?");
select.setInt(1, 1);
return select.executeQuery();
但是当我想选择value
为空的行时,结果集不包含任何行。我尝试过这两种方法:
select.setObject(1, null);
和
select.setNull(1, Types.INTEGER);
都没有工作!
发生了什么事?我知道检查NULL的正确SQL是where value is null
而不是where value=null
但是肯定JDBC很聪明,可以为我排序吗?
答案 0 :(得分:8)
什么都不是= NULL
。如果您在交互式查询评估程序中键入select * from test where value=NULL
,则无法获得任何结果。 JDBC不会重写您的表达式,它只是替换值。
您必须使用is
运算符来代替:
PreparedStatement select = c.prepareStatement("select * from test where value is NULL");
return select.executeQuery();
你已经说过,你希望JDBC能够“聪明”地为你做到这一点,但这会严重违反关注点。您可能希望使用=
在您的查询中设置参数,您设置NULL
知道该关系永远不会评估为真(作为更大条件集的一部分,最有可能的。)
答案 1 :(得分:0)
您可以将下面用作字符串并将 DB 值与 NULL 进行比较
String formatType="SomeValue";
String BuildingName = "Some Value";
String floor = "SomeValue";
String query = "SELECT pd.*\n" +
"FROM PROPERTY_DETAIL pd\n" +
"WHERE pd.FORMAT_TYPE = '"+formatType+"'\n" +
" AND (pd.BUILDING_NAME = '"+BuildingName+"' OR (pd.BUILDING_NAME IS NULL))\n" +
" AND (pd.FLOOR = '"+floor+"' OR (pd.FLOOR IS NULL))";
DBConnection.executeSQLQuery(query);