sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgresql intenta usar el formato de ejecución en una función pero obtiene un error de columna no encontrada al dar formato de cadena en coalesce

Esto podría hacer lo que está buscando:

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;
  • La expresión where to_date(Date, "YYYY-MM-DD")==%I',_t); está al revés de varias maneras.

    • Comillas simples para valores :'YYYY-MM-DD' .
    • El operador es = , no == .
    • Parece que realmente quieres t.Date = to_date(_t, 'YYYY-MM-DD')
    • Y mientras _t está en el formato ISO estándar 'YYYY-MM-DD', en lugar de emitir:t.Date = _t::date .
  • Los nombres de las columnas de salida están visibles dentro del cuerpo de la función. Columna de calificación de tabla del mismo nombre. Mejor aún, ¡evite nombrar conflictos como ese para empezar! Ver:

  • No hay necesidad de SQL dinámico con EXECUTE . Pasar un valor de datos funciona perfectamente con SQL simple.

  • No es necesario plpgsql. La consulta simple no requiere ninguna funcionalidad de procedimiento. LANGUAGE sql hace el trabajo:si necesita una función, SQL simple parecería estar bien para el trabajo.

Aparte:no use nombres de tipos básicos como "fecha" como identificador. Cíñete a los identificadores legales en minúsculas. Relacionado: