Прочитать и оценить ячейку как ключевое слово в PostgreSQL - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица с именем providers, в которой столбец notice_period принимает такие значения, как interval '1 month' - interval '2 days'. Если я сделаю следующее:

select to_date('11.11.2020', 'dd-mm-yyyyy') + notice_period from providers, я получаю следующую ошибку:

42883] ОШИБКА: оператор не существует: `text

Как я могу избежать этой ошибки и использовать значение notice_period для прямого вычисления действительной даты?

Ура

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Другой вариант - использовать динамический c SQL в функции:

CREATE FUNCTION add_period(timestamp with time zone) RETURNS timestamp with time zone
   LANGUAGE plpgsql STRICT AS
$$DECLARE
   result timestamp with time zone;
BEGIN
   EXECUTE format(
              'SELECT TIMESTAMP WITH TIME ZONE %L + %s',
              $1,
              (SELECT notice_period FROM providers)
           ) INTO result;
   RETURN result;
END;$$;

Проблема в том, что все это уязвимо для SQL инъекции неверными значениями в таблице providers, поэтому используйте это, только если вы можете доверять источнику.

Этой проблемы нельзя избежать с SQL строками, поставляемыми извне.

1 голос
/ 26 мая 2020

Postgres легко конвертирует интервалы в строки. Я бы рекомендовал удалить ключевое слово interval и просто использовать ::interval:

select date_trunc('year', now()) + notice_period::interval
from (values ('1 day'), ( '3 month 1 day')) v(notice_period)

Если вы настаиваете на interval в строке, удалите его:

+ replace(notice_period, 'interval ', '')::interval

или:

+ substr(notice_period, 10)::interval
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...