1

我正在使用我的 python 脚本查询一个 sqlite 数据库表。

SELECT servername, 
     date('now','localtime'),
     sum(CASE WHEN locked="NO" THEN 1 END),
     sum(CASE WHEN locked="YES" THEN 1 END) 
FROM nodes
WHERE servername="SOME_SERVER"

它工作正常(给我服务器名称、今天的日期、未锁定节点的数量和锁定节点的数量)...

...除非查询不匹配(即没有提供的名称的服务器名称)。在这种情况下,查询结果是

空,“2013-04-15”,空,空

(为了清楚起见,我添加了空值)

某些服务器没有节点是有效的。如果我从查询中删除“案例”,我不会得到任何查询结果,所以当我不想要一个结果时,它们会导致我得到一个结果。

如何使它在 SQL 查询中不返回任何内容,而无需在 python 中检测它,或事先查询计数?

4

1 回答 1

3

嗯加个

group by servername

如果没有匹配项,则空白行会消失,正如我偶然发现的那样。我在解释这一点时遇到了麻烦,但我认为sqlite 文档中涵盖了这一点:

如果 SELECT 语句是没有 GROUP BY 子句的聚合查询,则结果集中的每个聚合表达式都会在整个数据集上计算一次。结果集中的每个非聚合表达式都会针对任意选择的数据集行进行一次评估。相同的任意选择的行用于每个非聚合表达式。或者,如果数据集包含零行,则每个非聚合表达式都针对完全由 NULL 值组成的行进行评估。

通过计算结果集中的聚合和非聚合表达式创建的单行结果集数据形成了不带 GROUP BY 子句的聚合查询的结果。没有 GROUP BY 子句的聚合查询总是只返回一行数据,即使有零行输入数据。

于 2013-04-15T11:47:15.717 回答