PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgresql versucht, das Ausführungsformat in einer Funktion zu verwenden, erhält jedoch den Fehler „Spalte nicht gefunden“, wenn das Zeichenfolgenformat in Coalesce angegeben wird

Dies könnte das tun, wonach Sie suchen:

CREATE OR REPLACE FUNCTION foo(_t text)
  RETURNS TABLE (Stage_ID bigint, Date varchar) AS
$func$
   SELECT t.Stage_ID, t.Date
   FROM   tbl t
   WHERE  t.Date = _t::date;
$func$  LANGUAGE sql;
  • Der Ausdruck where to_date(Date, "YYYY-MM-DD")==%I',_t); ist in mehrfacher Hinsicht rückwärts.

    • Einfache Anführungszeichen für Werte :'YYYY-MM-DD' .
    • Der Operator ist = , nicht == .
    • Sieht so aus, als wollten Sie wirklich t.Date = to_date(_t, 'YYYY-MM-DD')
    • Und während _t ist in der Standard-ISO-Form 'YYYY-MM-DD', statt dessen einfach umzuwandeln:t.Date = _t::date .
  • Die Namen der Ausgabespalten sind im Funktionskörper sichtbar. Tabellenqualifizierende Spalte mit demselben Namen. Besser noch, vermeiden Sie solche Namenskonflikte von vornherein! Siehe:

  • Keine Notwendigkeit für dynamisches SQL mit EXECUTE . Das Übergeben eines Datenwerts funktioniert nur mit einfachem SQL.

  • plpgsql ist nicht erforderlich. Die einfache Abfrage erfordert keine prozedurale Funktionalität. LANGUAGE sql macht den Job - wenn Sie überhaupt eine Funktion brauchen, scheint einfaches SQL für den Job gut geeignet zu sein.

Übrigens:Verwenden Sie keine einfachen Typnamen wie "Datum" als Bezeichner. Halten Sie sich an gültige Kleinbuchstaben. Verwandte: