【问题标题】:PostgreSQL libpq: PQNumber and column aliasesPostgreSQL libpq:PQNumber 和列别名
【发布时间】:2012-04-16 15:19:01
【问题描述】:

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

还有其他方法吗?

【问题讨论】:

    标签: sql c postgresql libpq


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果你使用这样的构造:

      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 异常。

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

      【讨论】:

        猜你喜欢
        • 2011-11-22
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 2011-03-20
        • 2014-02-05
        • 2016-10-28
        • 2011-03-15
        相关资源
        最近更新 更多