我正在使用libpq访问PostgreSQL服务器。我的查询看起来像这样('Africa'是任何字符串,column_2
和column_3
都是有效名称,并且从psql提示符执行时,两个查询都返回正常):
SELECT column_2
FROM mytable
WHERE column_1='Africa' AND column_2 IS NOT NULL
LIMIT 1;
我得到1行1列的结果。然后一段时间后,我将column_2
更改为column_3
并发出:
SELECT column_3
FROM mytable
WHERE column_1='Africa' AND column_3 IS NOT NULL
LIMIT 1;
现在PQnfields()
按预期返回1,但PQntuples
返回0!
所以现在由于某种原因有0行,这当然会打破对data = PQgetvalue(resuls, 0, 0)
可能的错误来源是什么?为什么如果没有行,它甚至会返回1列?
答案 0 :(得分:2)
此查询有一列但零行:
SELECT a as col1
FROM generate_series(1,2) a
WHERE false;
尽管如此,它仍然具有相同的结果类型,就好像它没有WHERE FALSE
一样。它只有零行。
这就是为什么我更喜欢考虑字段和记录,而不是"列"和"行"。后者会让您将其视为电子表格,但关系不是电子表格表。它仍然有一个明确定义的结构,即使它是空的。
因此,如果PQntuples
返回零,请勿尝试访问不存在的结果。查询返回零行是正常的,也是可以接受的。它可以很方便;例如,您仍然可以使用PQftype
来确定 返回的任何结果的数据类型(如果有的话)。
它以这种方式工作的根本原因是PostgreSQL在几个阶段中回答了一个查询(通过假设v3协议解析/绑定/描述/执行执行并跳过不相关的步骤来简化):
因此,即使没有任何结果行,我们也已经知道他们将拥有的结构。