根据您的第一个查询,您似乎误解了case when
. 这就像if
一个单一的价值。它通常用于根据某些列值获取所需的值,例如
SELECT CASE WHEN col>0 THEN 1 ELSE 0 END FROM table
然而,它也可以用于条件下的一些漂亮技巧,例如
SELECT col FROM table WHERE CASE WHEN some_param = 1 THEN col2 = 1 ELSE true END
如果某个输入参数为 1,则此语句检索col
行的列,col2 = 1
如果输入参数不是 1,则检索所有行。
使用WHERE ... AND
检查条件,例如
SELECT col FROM table WHERE col>0 AND col2=0
在您的情况下,如果未找到匹配值,您将尝试选择 null 。我不认为这是处理它的正确方法。您应该尝试选择您要查找的内容,然后检查是否有任何行返回。你基本上会得到这样的东西:
ResultSet rs = stmt.executeQuery("SELECT [some column names] FROM [a database] WHERE fitness>=2 AND live=1 AND indivID!=[specific individual]");
if(rs.first()) {
//You have some data - loop over the resultset and retrieve it
}
else {
//There are no matches to your query
}
如果您只想要一个匹配,那么您可以将其简化为
ResultSet rs = stmt.executeQuery("SELECT [some column names] FROM [a database] WHERE fitness>=2 AND live=1 AND indivID!=[specific individual] LIMIT 1");
String name = rs.first() ? rs.getString(1) : null;
请注意,我将索引 1 用于getString
- 但它可能是您需要的任何东西。
编辑:如果您正在处理 SQLite,那么您有一个单向可移动的结果集,因此您需要稍微更改上面的代码:
ResultSet rs = stmt.executeQuery("SELECT [some column names] FROM [a database] WHERE fitness>=2 AND live=1 AND indivID!=[specific individual]");
if(!rs.isBeforeFirst()) {
//You have some data - loop over the resultset and retrieve it
}
else {
//There are no matches to your query
}
并且,相应地,
ResultSet rs = stmt.executeQuery("SELECT [some column names] FROM [a database] WHERE fitness>=2 AND live=1 AND indivID!=[specific individual] LIMIT 1");
String name = !rs.isBeforeFirst() ? null : rs.getString(1) : null;;
注意条件的变化rs.first()
和!rs.isBeforeFirst()
反转。