sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgresql forsøger at bruge execute-format i en funktion, men får kolonnen ikke fundet fejl ved at give strengformat i coalesce

Dette kan gøre det, du leder efter:

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;
  • Udtrykket where to_date(Date, "YYYY-MM-DD")==%I',_t); er baglæns på flere måder.

    • Enkelte anførselstegn for værdier :'YYYY-MM-DD' .
    • Operatøren er = , ikke == .
    • Det ser ud til, at du virkelig vil have t.Date = to_date(_t, 'YYYY-MM-DD')
    • Og mens _t er i standard ISO-form 'ÅÅÅÅ-MM-DD', cast i stedet for:t.Date = _t::date .
  • Outputkolonnenavne er synlige inde i funktionsteksten. Tabelkvalificerer kolonne af samme navn. Endnu bedre, undgå at navngive konflikter som den til at begynde med! Se:

  • Intet behov for dynamisk SQL med EXECUTE . At sende en dataværdi fungerer fint med almindelig SQL.

  • Intet behov for plpgsql. Den simple forespørgsel kræver ingen proceduremæssig funktionalitet. LANGUAGE sql udfører jobbet - hvis du overhovedet har brug for en funktion, ville almindelig SQL virke helt fint til jobbet.

Bortset fra:Brug ikke grundlæggende typenavne som "dato" som identifikator. Hold dig til lovlige identifikatorer med små bogstaver. Relateret:




  1. SQL Server (MSSQL DBA) Databasevejledninger for begyndere, databaseadministratorer

  2. MySQL:hvordan forhindrer man indsættelse af en række med alle kolonner =NULL?

  3. bruger c# datetime i mysql opdateringsforespørgsel

  4. LOAD DATA LOCAL INFILE stopper import ved 69.000 rækker