Удаление двойных кавычек из конкатенированной строки в идентификаторе plpgsql

77
7

Я написал следующую функцию, которая возвращает записи из другой таблицы "parameters_ltree_ {time_created}", где time_created - столбец из таблицы history_ltree.

CREATE OF REPLAE function get_my_path(date_string text, path_arg ltree) RETURNS SETOF  ltree AS
$BODY$
DECLARE
p text;
d text;
BEGIN
d := quote_ident(date_string);
p := 'parameters_ltree_';
RETURN QUERY EXECUTE format(
'SELECT path from %I' || '%I
WHERE path = %I
ORDER BY path
LIMIT 1'
, p, date_string, path_arg);

END
$BODY$
LANGUAGE plpgsql;

SELECT id, path, get_my_path(to_char(time_created, 'YYYYMMDD')), path) from historical_ltree

Функция компилируется, но когда я запускаю запрос SELECT внизу, он вызывает синтаксическую ошибку:

ERROR: relation "parameters_ltree_" does not exist
LINE 1: SELECT path FROM parameters_ltree_"20161201"
^

Я пробовал много разных методов, чтобы эта конкатенация работала правильно, но безрезультатно, включая передачу date_string в виде числа.

спросил(а) 2021-01-25T19:32:02+03:00 5 месяцев назад
1
Решение
63

попробуйте изменить на:

    RETURN QUERY EXECUTE format(
'SELECT path from %I
WHERE path = %L
ORDER BY path
LIMIT 1'
, 'parameters_ltree_'||date_string, path_arg);

https://www.postgresql.org/docs/current/static/functions-string.html

s форматирует значение аргумента как простую строку. Нулевое значение рассматривается как пустая строка.

Я рассматриваю значение аргумента как идентификатор SQL, при необходимости дублируя его. Это ошибка для значения null (эквивалентно quote_ident).

L цитирует значение аргумента как литерал SQL. Нулевое значение отображается как строка NULL, без кавычек (эквивалентно quote_nullable).

ответил(а) 2021-01-25T19:32:02+03:00 5 месяцев назад
45

Вы можете попробовать это


p := 'parameters_ltree_'||date_string;
RETURN QUERY EXECUTE format(
'SELECT path from %I
WHERE path = %I
ORDER BY path
LIMIT 1'
, p, path_arg);

ответил(а) 2021-01-25T19:32:02+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема