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

我是sqlite的新手并且有一个填充的数据库,我需要确定数据库中的任何数字生物是否具有适合度的阈值水平(适应度> = 2)并且是活着的(生命= 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)在这些查询中可能甚至可能存在可能没有足够高适应度(大于2)的“live = 1”个体来获得select语句的资格,因此这两个查询的结果都是不可行的个人(如果写得正确)则为空?

在此先感谢您的帮助!

解决方法

根据你的第一个问题,你似乎误解了案例的用法.这就像是单个值的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,则此语句检索其中col2 = 1的行的列col;如果输入参数不是1,则此语句将检索所有行的列col.

使用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()和条件的反转.

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能