sql >> Database >  >> RDS >> PostgreSQL

Postgresql probeert de uitvoeringsindeling in een functie te gebruiken, maar krijgt een kolom niet gevonden fout bij het geven van een tekenreeksindeling in samenvloeien

Dit zou kunnen doen wat u zoekt:

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;
  • De uitdrukking where to_date(Date, "YYYY-MM-DD")==%I',_t); is op meerdere manieren achteruit.

    • Enkele aanhalingstekens voor waarden :'YYYY-MM-DD' .
    • De operator is = , niet == .
    • Het lijkt erop dat je echt wilt t.Date = to_date(_t, 'YYYY-MM-DD')
    • En terwijl _t is in standaard ISO-vorm 'YYYY-MM-DD', liever gewoon casten:t.Date = _t::date .
  • De namen van uitvoerkolommen zijn zichtbaar in de hoofdtekst van de functie. Tabelkwalificerende kolom met dezelfde naam. Beter nog, vermijd het benoemen van dergelijke conflicten om mee te beginnen! Zie:

  • Geen dynamische SQL nodig met EXECUTE . Het doorgeven van een gegevenswaarde werkt prima met gewone SQL.

  • Plpgsql is niet nodig. De eenvoudige query vereist geen procedurele functionaliteit. LANGUAGE sql doet het werk - als je al een functie nodig hebt, lijkt gewone SQL prima voor het werk.

Terzijde:gebruik geen basistypenamen zoals "datum" als identifier. Houd u aan legale identificatiecodes in kleine letters. Gerelateerd:




  1. Vereist om deel te nemen aan 2 tafels met hun FK's in een 3e tafel

  2. Een tabel maken in de modus voor één gebruiker in postgre

  3. Index gebruiken in LEFT JOIN met OR-voorwaarde

  4. Selecteer N-de rij uit een tabel in Oracle