PostgreSQL libpq:PQNumber和列别名

时间:2012-04-16 15:19:02

标签: sql c postgresql libpq

在Postgres libpq sql中有一个函数PQfnumber:返回与给定列名相关联的列号。

假设我有一个选择:

select a.*, b.* from a, b where a.id = b.id

现在,如果我打电话

number = PQfnumber(pgresult, "a.id");

它将返回-1。

正确的方法是致电:

number = PQfnumber(pgresult, "id");

返回a.id的位置那么我怎么需要调用函数来获取b.id的列号? 围绕它的唯一方法似乎是写一个不同的选择:

select a.id as a_id, a.*, b.id as b_id, b.* from a, b where a.id = b.id

number = PQfnumber(pgresult, "b_id");

还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

不,你找到了正确的方法。

当然,在内连接中使用a.id = b.id(如示例代码中所示),为什么要关注您正在查看的列?此外,还有很好的理由只有id列作为每个表的主键。即使很多表都有单列整数键,如果您始终将包含主键的列命名为给定表,则可以使用更为有效的语法JOIN ... USING

答案 1 :(得分:0)

如果您使用这样的构造:

number = PQfnumber(pgresult, "a.id");

然后你的查询应该包含这样的列别名:

SELECT a.id AS "a.id", b.* FROM a, b WHERE a.id = b.id;

您的代码确实存在歧义,如果您在PL / pgSQL语言中尝试此类查询,则会收到42702: ambiguous_column异常。

我看到了唯一的出路 - 您应该为查询的所有雄心勃勃的列提供唯一的别名。事实上,为所有列提供别名是一个好习惯,我总是这样做。