2

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;    
4

2 に答える 2

0

@Erwin Brandstetter、広範な回答に感謝します。pg_stats は確かにいくつかのものを提供しますが、完全なプロファイルを描画するために本当に必要なのは、さまざまなもの、最小値、最大値、カウント、null のカウント、平均などです...そのため、一連のクエリを実行する必要があります各列、一部は GROUP BY など。

また、データ型の重要性を強調してくれてありがとう、私はこれがいつか作業にスパナをスローすることを期待していました.私の主な関心事は、クエリの生成とその実行を自動化する方法でした.この最後のビットが私のメインです.懸念。

私はあなたが提供する機能を試しました(おそらくいくつかのplpgsqlの学習を開始する必要があります)が、 SELECT (t::tbl) でエラーが発生します:

ERROR: type "tbl" does not exist

ところで、(t::abc) 表記とは何ですか。Python では、これはリスト スライスになりますが、PLPGSQL ではおそらくそうではありません

于 2015-04-14T08:20:33.153 に答える