Arbeits-SQL
Der folgende Code funktioniert wie erwartet und gibt zwei Datenspalten zurück (eine Zeilennummer und einen gültigen Wert):
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;
Nicht-arbeitende SQL
Der folgende Code funktioniert nicht wie erwartet; die erste Spalte ist eine Zeilennummer, die zweite Spalte ist 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;
Question
Warum gibt der nicht funktionierende Code ein NULL
Wert für die zweite Spalte, wenn die Abfrage selbst zwei gültige Spalten liefert? (Diese Frage ist vor allem akademisch; wenn es eine Möglichkeit gibt, die Abfrage auszudrücken, ohne sie in eine Textzeichenfolge zu verpacken, wäre das toll zu wissen).
Vollständiger Code
Software
PostgreSQL 8.4
Ich danke Ihnen.