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 に答える