使用“case”时获取空行(实际上在使用聚合时)

时间:2013-04-15 11:32:00

标签: python sqlite

我正在使用我的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年4月15日”,NULL,NULL

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

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

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

1 个答案:

答案 0 :(得分:3)

嗯添加

group by servername
如果没有匹配,

会使空行消失,因为我偶然发现了。我在解释这个问题时遇到了麻烦,但我在 中认为这个在sqlite文档中涵盖了它:

  

如果SELECT语句是没有GROUP BY的聚合查询   子句,然后评估结果集中的每个聚合表达式   一次跨越整个数据集。每个非聚合表达式   对于任意选择的行,对结果集进行一次计算   数据集。每个使用相同的任意选择的行   非聚合表达。或者,如果数据集包含零行,那么   每个非聚合表达式针对包含的行进行评估   完全是NULL值。

     

通过评估聚合创建的单行结果集数据   结果集中的非聚合表达式和结果集中的非聚合表达式   没有GROUP BY子句的聚合查询。 没有的聚合查询   GROUP BY子句总是返回一行数据,即使是   输入数据为零行。