1

在 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");

有没有其他办法解决这个问题?

4

2 回答 2

1

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

当然,a.id = b.id在内部连接中(如示例代码中),您为什么要关心您查看的是哪一列?此外,有充分的理由id列作为每个表的主键。即使很多表都有单列整数键,如果您始终如一地命名包含给定表的主键的列,则可以使用更简洁和更有效的语法JOIN ... USING

于 2012-04-16T15:54:23.747 回答
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异常。

我看到了唯一的出路——你应该为查询的所有雄心勃勃的列提供唯一的别名。事实上,为所有列指定别名是一种很好的做法,我总是这样做。

于 2012-04-16T15:51:31.707 回答