我是 sqlite 的新手,并且有一个填充的数据库,我需要在其中确定数据库中的任何数字生物体是否具有适合度的阈值水平 (fitness>=2) 并且还活着 (live=1)。我还需要排除我试图为其寻找合适伴侣的生物体的 indivID(主键)( indivID INTEGER PRIMARY KEY )。
下面我尝试了第一行代码,但它抛出了一个 SQL 错误:
[SQLITE_ERROR] SQL error or missing database (near "CASE": syntax error).
但是我知道错误出在 SQL 语句中,因为其他函数正在成功访问数据库。
SELECT indivID FROM population CASE fitness >=2 WHEN live = 1 AND indivID!=[specific individual] ELSE NULL END
我已经尝试了下一行代码,它可以工作,但没有正确排除特定个人的 indivID:
SELECT [some column names] FROM [a database] WHERE fitness>=2 AND live=1 AND indivID!=[specific individual]
我有三个问题:
1)我在上述陈述中的错误在哪里
2)使用“case...when”和“where...and”语句有什么区别
3)在这些查询中可能甚至可能没有“live=1”个体具有足够高的适应度(高于 2)来符合选择语句的资格,因此这两个查询的结果都将不可行个人(如果正确书写)则为空?
在此先感谢您的帮助!
最佳答案
根据你的第一个查询,你似乎误解了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
此语句检索列
col
对于行,其中 col2 = 1
如果某个输入参数为 1,或者对于所有行,如果输入参数不是 1。使用
WHERE ... AND
检查条件,例如SELECT col FROM table WHERE col>0 AND col2=0
在您的情况下,如果没有找到匹配的值,您将尝试选择一个空值。我不认为这是处理它的正确方法。您应该尝试选择您要查找的内容,然后检查是否返回了任何行。你基本上会得到这样的东西:
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;
请注意,我对
getString
使用了索引 1 - 但它可能是你需要的任何东西。编辑:如果您正在处理 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()
和情况的逆转。
关于sqlite 选择 where...and vs. case...when,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16863278/