Oracle と SQL Server で求めようとしている問題の解決策を (私は思うに) 見つけましたが、これを Postgres ソリューションに変換することはできないようです。Postgres 9.3.6 を使用しています。
アイデアは、プロファイリングの目的でテーブル コンテンツに関する「メタデータ」を生成できるようにすることです。これは、列ごとにクエリを実行して、たとえば...最小値/最大値/カウント値などを調べることによってのみ実行できます(AFAIK)。手順を自動化するには、DB によって生成されたクエリを実行することが望ましいです。
サンプルsalesdata
テーブルでは、次のスニペットを使用して、各列の選択クエリを生成し、min() 値を返すことができます。
SELECT 'SELECT min('||column_name||') as minval_'||column_name||' from salesdata '
FROM information_schema.columns
WHERE table_name = 'salesdata'
利点は、列の数に関係なく、データベースがコードを生成することです。これらのクエリを保存する場所として、何らかの変数またはテーブル列のいずれかを考えていましたが、これらのクエリを実行するというアイデアは無数にあります。生成されたクエリを変数に格納し、ここでEXECUTE
採用されているアプローチである(or EXECUTE IMMEDIATE
) ステートメントを使用してそれらを実行することを考えました(右ペインを参照)。しかし、Postgres では関数の外側で変数を宣言することができず、私はスクラッチしてきました。これがどのように適合するかについての私の頭は、それが従うべき方向であるかどうかにかかわらず、おそらくもっと簡単なものがあるでしょう.
私は現在、この他の質問に触発されて、このようなことを試みていますが、私が正しい方向に向かっているかどうかはわかりません:
CREATE OR REPLACE FUNCTION foo()
RETURNS void AS
$$
DECLARE
dyn_sql text;
BEGIN
dyn_sql := SELECT 'SELECT min('||column_name||') from salesdata'
FROM information_schema.columns
WHERE table_name = 'salesdata';
execute dyn_sql
END
$$ LANGUAGE PLPGSQL;