ワーキングSQL
次のコードは期待どおりに機能し、2 列のデータ (行番号と有効な値) を返します。
sql_amounts := '
SELECT
row_number() OVER (ORDER BY taken)::integer,
avg( amount )::double precision
FROM
x_function( '|| id || ', 25 ) ca,
x_table m
WHERE
m.category_id = 1 AND
m.location_id = ca.id AND
extract( month from m.taken ) = 1 AND
extract( day from m.taken ) = 1
GROUP BY
m.taken
ORDER BY
m.taken';
FOR r, amount IN EXECUTE sql_amounts LOOP
SELECT array_append( v_row, r::integer ) INTO v_row;
SELECT array_append( v_amount, amount::double precision ) INTO v_amount;
END LOOP;
機能しない SQL
次のコードは期待どおりに動作しません。最初の列は行番号、2 番目の列はNULLです。
FOR r, amount IN
SELECT
row_number() OVER (ORDER BY taken)::integer,
avg( amount )::double precision
FROM
x_function( id, 25 ) ca,
x_table m
WHERE
m.category_id = 1 AND
m.location_id = ca.id AND
extract( month from m.taken ) = 1 AND
extract( day from m.taken ) = 1
GROUP BY
m.taken
ORDER BY
m.taken
LOOP
SELECT array_append( v_row, r::integer ) INTO v_row;
SELECT array_append( v_amount, amount::double precision ) INTO v_amount;
END LOOP;
質問
NULLクエリ自体が 2 つの有効な列を返すのに、機能しないコードが 2 番目の列の値を返すのはなぜですか? (この質問は主に学術的なものです。クエリをテキスト文字列でラップせずに表現する方法があれば、それを知っておくとよいでしょう。)
完全なコード
ソフトウェア
PostgreSQL 8.4
ありがとうございました。