2016-09-05 104 views
4

Amazon Redshiftの文字列フィールドに格納された動的SQLクエリを実行したいとします。Redshift:文字列から動的クエリを実行する

私の背景は、主にT-SQLリレーショナルデータベースです。私はSQLステートメントを動的に構築し、変数に格納して実行しました。私はRedshiftがステートメントを準備して実行できることは知っていますが、文字列フィールドに格納されたクエリを実行できるかどうかは疑問です。

私は、pg_ *システムテーブルを使用して、いくつかのテーブルで以下のコードを動的に構築するコードをいくつか用意しています。すべての列/テーブル名が動的に計算されます。ここでは、クエリの出力の例です:

SELECT h_article_id AS key, 'transport_parameters_weight_in_grams' AS col_name, COUNT(DISTINCT transport_parameters_weight_in_grams) AS count_value FROM dv.s_products GROUP BY h_article_id UNION ALL 
SELECT h_article_id AS key, 'transport_parameters_width_in_mm' AS col_name, COUNT(DISTINCT transport_parameters_width_in_mm) AS count_value FROM dv.s_products GROUP BY h_article_id UNION ALL 
SELECT h_article_id AS key, 'label_owner_info_communication_address' AS col_name, COUNT(DISTINCT label_owner_info_communication_address) AS count_value FROM dv.s_products GROUP BY h_article_id 

私は入力に別のクエリ内のコードのこのダイナミックな作品をしたいと思いますので、私はいくつかの統計を作ることができ、そのよう:

SELECT col_name, AVG(count_value*1.00) AS avg_count 
FROM (
    'QUERY ABOVE' 
) A 
GROUP BY col_name; 

これは何かを出力リレーう以下のようになります。

col_name        avg_count 
transport_parameters_weight_in_grams 1.00 
transport_parameters_width_in_mm  1.00 
label_owner_info_communication_address 0.60 

これを行うための自然な方法は、すべてを変数に文字列として格納して実行することです。しかし、私はRedshiftがこれをサポートしていないのではないかと心配しています。

実際に動的SQLコードを作成する別の方法はありますか?

答えて

2

いいえRedshiftで動的にビルドされたSQLコードを実行する簡単な方法はありません。

MS SQL Serverと同様に、SQL変数を定義したり、ストアドプロシージャを作成することはできません。

Python Functions in Redshiftを作成することはできますが、PythonとSQLをコーディングすることになります。

クエリは"PREPARE" and "EXECUTE" statements to run "pre-defined" SQLですが、実行コマンドに渡す前にデータベース外に作成する必要があります。データベース外のステートメントを作成することによって、目的を破ることができます。あなたは「お気に入りの」プログラミング言語でステートメントを作成できます。

私が言ったように、このSQLベースのデータベース内の動的SQLは存在しません。

基本的には、このロジックをアプリケーションで実行するか、AWS Data Pipelineなどのロジックを使用する必要があります。

+0

ご回答いただきありがとうございます。 "あなたは、実行の前にデータベースの外部にステートメントを作成しなければなりません"と言います。私は文を渡すことができますが、($変数を除いて)ほとんどハードコーディングされています。私はいくつかのSQLクエリを含む列を持つテーブルがあるとします。これらのクエリを 'EXECUTE'コマンドに渡すことは可能でしょうか? – anahnarciso

+0

はい、可能ですが、まずそれらを「準備する」必要があります。 – BigDataKid

+0

しかし、私はまだそれがどうなるかは分かりません。選択クエリを含むvarchar列 "query"を持つテーブルAを考えてみましょう。 これは 'prepare'ステートメントの例ですが、あまりにもハードコードされているようです。 'PREPARE prep_select_plan(int) AS select * from prep1 where c1 = $ 1;' 別のテーブルのvarcharフィールドに含まれているクエリをどのように参照しますか? – anahnarciso

関連する問題