sqlite选择哪里...和vs. case ...何时

时间:2013-05-31 18:06:20

标签: sql sqlite jdbc

我是sqlite的新手,并且有一个填充的数据库,我需要确定数据库中的任何数字生物是否具有适合度的阈值水平(适应度> = 2)并且是否存活(生命= 1)。我还需要排除我想要找到合适配偶的生物体的indivID(主键)( indivID INTEGER PRIMARY KEY )。

下面我尝试了第一行代码,但它引发了一个SQL错误:

  

[SQLITE_ERROR] SQL错误或缺少数据库(靠近“CASE”:语法   误差)。

但是我知道SQL语句中的错误是因为其他函数正在成功访问数据库。

SELECT indivID FROM population CASE fitness >=2 WHEN live = 1 AND indivID!=[specific individual] ELSE NULL END

我已尝试过下一行代码,但有效但不能正确排除特定个人的个人代码:

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)才有资格获得select语句,因此这两个查询的结果也是如此没有可行的个体(如果写得正确)则为空?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:7)

根据您的第一个问题,您似乎误解了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 检查条件,例如

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
}

在您的情况下,如果找不到匹配的值,则尝试选择null。我不认为这是处理它的正确方法。您应该尝试选择要查找的内容,然后检查是否有任何行。你基本上会得到这样的东西:

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

请注意,我使用了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 } 的索引1 - 但它可能是您需要的任何内容。

编辑:如果你正在处理SQLite,那么你有一个单向可移动的结果集,因此你需要稍微更改上面的代码:

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()到{{1}}的变化以及条件的逆转。