ユーザー入力に基づいて3つのテーブルからデータを準備し、COPY TO
を使用してデータをエクスポートする必要があるplpgsql
関数があります。データは交通事故であるため、3つのテーブルはaccident
,casualty
およびvehicle
であり、それぞれの事故は、3つのテーブルすべてに存在するaccidentid
列を介して車両および死傷者テーブルのゼロ以上のレコードにリンクしています。 severity
およびlocal_authorities
は入力パラメータ(両方ともtext []
)です。動的SQLクエリでWITHブロックを使用する方法
sql_query = 'SELECT COUNT(*) FROM accident WHERE severity = ANY(' || quote_literal(severity)
|| ') AND local_auth = ANY (' || quote_literal(local_authorities) || ')';
EXECUTE sql_query INTO result_count;
IF result_count > 0 THEN
-- replace Select Count(*) With Select *
sql_query = Overlay(sql_query placing '*' from 8 for 8);
-- copy the accident data first
EXECUTE 'COPY (' || sql_query || ') TO ' || quote_literal(file_path || file_name_a) ||
' CSV';
この最初のビットは、関連する事故を取得しますので、私は今、関連の車両や損害データをダウンロードするために最初のクエリからaccidentid年代を使用するための最も効率的な方法を探しています。
私は、私はこのようなWITH
ブロックを使用することができるだろうと思った:
-- replace * with accidentid
sql_query = Overlay(sql_query placing 'accidentid' from 8 for 1);
WITH acc_ids AS (sql_query)
EXECUTE 'COPY (SELECT * FROM vehicle WHERE accidentid IN (SELECT accidentid FROM
acc_ids)) TO ' || out_path_and_vfilename || ' CSV';
EXECUTE 'COPY (SELECT * FROM casualty WHERE accidentid IN (SELECT accidentid FROM
acc_ids)) TO ' || out_path_and_cfilename || ' CSV';
が、エラーが出ます:
ERROR: syntax error at or near "$1"
LINE 1: WITH acc_ids AS ($1) EXECUTE 'COPY (SELECT * FROM accident....
私は非動的テストケースで上記を試してみました例えば
WITH acc_ids AS (
SELECT accidentid FROM accident
WHERE severity = ANY ('{3,2}')
AND local_auth = ANY ('{E09000001,E09000002}')
)
SELECT * FROM vehicle
WHERE accidentid IN (
SELECT accidentid FROM acc_ids);
残念ながら、サーバはまだPostgres 8.4
を実行していますので、当分はformat()
を使用することはできません。
これはおそらくWITH
ブロックでは不可能ですが、私が達成しようとしていることを少なくとも示してくれることを願っています。
編集/更新
主な目標は、理想的には場合accident
テーブルの上に3回
ました文字列としてのクエリ全体が意味をなさないので、私はそれが問題かもしれないと考えていました。私は3つの別々のエクスポートファイルが必要なので、私は結合でこれを行うことができるとは思わない、そうでなければ、この – Alex
の反対側でインポートルーチン全体を書き直さなければならない。実際には、 'copy'ステートメントのファイル名とパスも変数に保持されているとすれば、ほとんどの場合は 'execute'コピーをネストする必要があります(select '最初の' execute'文字列の中で、すべての引用が実用的でないと考えている – Alex
'COPY(WITH ... SELECT ...)TO ...'のようなものを書くときに何が問題になるのですか? –