2012-04-16 29 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例外。

我在這裏看到唯一的出路 - 您應該爲查詢的所有雄心勃勃的列提供唯一的別名。實際上,爲所有列提供別名是一種很好的做法,我總是這樣做。