このような動的構造を使用しようとすると、通常、動的アクセスに適したhstore
、、xml
などのデータ形式を使用する必要があることが示されます。
You アプリケーションでSQLをオンザフライで作成して動的列リストを取得します。 INFORMATION_SCHEMA
を照会して、表の列に関する情報を取得し、照会を作成することができます。
これは、PL/pgSQLでこれを行うとEXECUTE
で生成されたクエリを実行することが可能ですが、あなたは、あなたが展開することはできません、あなたが取得し、コンポジット・タプルをデコードしなければならないとして、それがやや困難、結果RECORD
で動作するように見つけることができます結果は通常の列リストに設定されます。観察:
craig=> CREATE OR REPLACE FUNCTION retrecset() returns setof record as $$
values (1,2,3,4), (10,11,12,13);
$$ language sql;
craig=> select retrecset();
retrecset
---------------
(1,2,3,4)
(10,11,12,13)
(2 rows)
craig=> select * from retrecset();
ERROR: a column definition list is required for functions returning "record"
craig=> select (r).* FROM (select retrecset()) AS x(r);
ERROR: record type has not been registered
あなたができることは、生のレコードを取得し、それをクライアントで復号することです。 SQLから索引付けすることはできません。他のものに変換することはできません。ほとんどのクライアントAPIは、匿名レコードのテキスト表現を解析する機能を提供していないので、あなた自身で書く必要があります。
したがって、はの結果の型を知らずにPL/PgSQLから動的レコードを返しますが、それは特に有用ではなく、クライアント側で処理するのは苦痛です。最初は、クライアントを使用してクエリを生成するだけです。
SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
FROM information_schema.columns As c
WHERE table_name = 'officepark'
AND c.column_name NOT IN('officeparkid', 'contractor')
), ',') || ' FROM officepark As o' As sqlstmt
結果はあなただけさらに実行する必要がSQL SELECTクエリです:
2010を含む列を返すか、特定の列の値に2010が含まれている行を返そうとしていますか?このような列のリストを選択することはできません(おそらく動的SQLを使用して)... – sgeddes
columnという名前の列はありますか? –
さて、私は名前の一部として2010年の列を返そうとしています。たとえば、名前がm01y2010の列があるので、m02y2010 ...などと同様に、その列に格納されている値も必要です。したがって、2010年の名前で列のリストを選択する方法はありません。 –