2 Stimmen

Unerwartete SQL-Ergebnisse: String vs. Direct SQL

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

http://pastebin.com/hgV8f8gL

Software

PostgreSQL 8.4

Ich danke Ihnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X