4

我是 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

我已经尝试了下一行代码,它可以工作,但不能正确排除特定个人的 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) 在这些查询中,可能甚至很可能没有具有足够高适应度(高于 2)的“live=1”个体有资格使用 select 语句,因此这两个查询的结果都没有可行个人(如果写得正确)然后为空?

在此先感谢您的帮助!

4

1 回答 1

10

根据您的第一个查询,您似乎误解了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()反转。

于 2013-05-31T18:24:23.943 回答