2012-04-16 3 views
1

В Postgres libpq sql есть функция PQfnumber: возвращает номер столбца, связанный с данным именем столбца.PostgreSQL libpq: PQNumber и псевдонимы столбцов

Допустим, у меня есть выбор:

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

Любой другой способ обойти это?

ответ

1

Нет, вы нашли правильный путь.

Конечно, с a.id = b.id во внутреннем соединении (как в примере кода), почему бы вам не заботиться о том, на какой колонке вы смотрели? Кроме того, есть веские причины не, чтобы иметь только столбец id в качестве первичного ключа для каждой таблицы. Даже если много таблиц имеют одноколоночные целые ключи, если вы последовательно называете столбцы, в которых хранится первичный ключ для данной таблицы, доступен тэстер и более эффективный синтаксис, например JOIN ... USING.

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.

Я вижу единственный выход - вы должны дать уникальные псевдонимы для всех амбициозных столбцов вашего запроса. На самом деле, хорошая практика давать псевдонимы для всех столбцов, я всегда это делаю.

Смежные вопросы