Postgresql пытается использовать формат выполнения в функции, но ошибка получения столбца при задании формата строки в coalesce - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать функцию и указать формат даты, но формат даты берется как имя столбца, потому что внутри формата он не может быть представлен в виде строки. Я пробовал% s, отступ в кавычках и все остальное, но не работает. Ниже мой код и ошибка, которую я получаю

drop function if exists foo(_t text);
create or replace function foo(_t text)
returns TABLE(Stage_ID bigint,Date varchar) as
$func$
begin
    return query

        execute format('Select Stage_ID,Date
        from table
        where to_date(Date, "YYYY-MM-DD")==%I',_t);
end
$func$  language plpgsql;
select * from foo('2010-01-01');

ОШИБКА

ERROR:  column "YYYY-MM-DD" does not exist
LINE:         where TO_DATE(Date, "YYYY-MM-DD") =  p...

1 Ответ

0 голосов
/ 30 апреля 2020

Это может сделать то, что вы ищете:

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;
  • Выражение where to_date(Date, "YYYY-MM-DD")==%I',_t); имеет обратную сторону несколькими способами.

    • Одиночные кавычки для значения : 'YYYY-MM-DD'.
    • Оператор =, а не ==.
    • Похоже, вы действительно хотите t.Date = to_date(_t, 'YYYY-MM-DD')
    • И хотя _t находится в стандартной форме ISO 'YYYY-MM-DD', вместо этого просто приведите вместо этого: t.Date = _t::date.
  • Имена выходных столбцов видны внутри функции тело. Табличный столбец с тем же именем. А еще лучше, во-первых, избегайте подобных конфликтов! См .:

  • Нет необходимости в Dynami c SQL с EXECUTE. Передача значения данных работает просто плавно с простым SQL.

  • Нет необходимости в plpg sql. Простой запрос не требует каких-либо процедурных функций. LANGUAGE sql справляется с задачей - если вам вообще нужна функция, простой SQL может показаться вполне подходящим для этой работы.

За исключением: не используйте имена типов basi c наподобие " дата "в качестве идентификатора. Придерживайтесь законных, строчных идентификаторов. Связанные:

...