14

結果セットの各列のラベルを取得して、そのテーブルの名前の前に追加するにはどうすればよいですか?

これは、結合だけでなく単一のテーブルに対するクエリでも発生するようにしたいと思います。

例:

  SELECT first_name, last_name FROM person;

結果を次のようにします。

 | person.first_name | person.last_name |
 |-------------------|------------------|
 | Wendy             | Melvoin          |
 | Lisa              | Coleman          |

「AS」を使用して各列のエイリアスを定義することもできますが、それは面倒です。これを自動的に実行したい。

  SELECT first_name AS person.first_name, last_name AS person.last_name FROM person;

私の質問の理由は、結果セットがデータを取得したデータベース列を通知するメタデータを提供しないデータベースドライバーを使用しているためです。結果セットを処理するための汎用コードを作成しようとしています。

一般的にSQLで、または少なくともPostgresでこれを行う方法を知りたいです。

SQLiteにはそのような機能がありましたが、現在は不可解に非推奨になっているようです。SQLiteには、 full_column_namesshort_column_namesの2つのプラグマ設定があります。

4

2 に答える 2

21

この質問は少し古いことは知っていますが、おそらく誰かが答えにつまずいて、それが彼らを助けるでしょう。

探していることを行う適切な方法は、ビューを作成して使用することです。はい、これらすべての新しい列名をエイリアスとして入力するのは少し面倒ですが、列がたくさんある場合は、PostgreSQLメタデータを利用してビューのテキストを書き出すために使用できるトリックがあります。

select 'CREATE OR REPLACE VIEW people AS SELECT ' || 
(select string_agg(column_name || ' AS person_' || column_name, ', ')
from information_schema.columns
where table_name = 'person'
group by table_name) || 
' FROM person;';

これを実行すると、次のようになります。

?column?                                                 
------------------------------------------------------------------------------------------------------------- 
CREATE OR REPLACE VIEW people AS SELECT last_name AS person_last_name, first_name AS person_first_name FROM person; 

1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
[Executed: 4/21/12 2:05:21 PM EDT ] [Execution: 9/ms]

次に、結果と出来上がりをコピーして実行できます。

select * from people;

 person_last_name     person_first_name    
 -------------------  -------------------- 
 Melvoin              Wendy                
 Coleman              Lisa                 

 2 record(s) selected [Fetch MetaData: 1/ms] [Fetch Data: 0/ms] 
于 2012-04-21T18:10:43.273 に答える