从plpgsql标识符中的连接字符串中删除双引号

时间:2017-06-23 09:39:53

标签: sql postgresql dynamic plpgsql

我编写了以下函数,该函数返回另一个表中的记录" parameters_ltree_ {time_created}'其中time_created是historical_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作为数字传递。

2 个答案:

答案 0 :(得分:0)

尝试改为:

    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

  

将参数值格式化为简单字符串。空值是   被视为空字符串。

     

我将参数值视为SQL标识符,如果是,则对其进行双引号   必要。该值为null是错误的(相当于   quote_ident)。

     

L引用参数值作为SQL文字。空值是   显示为字符串NULL,不带引号(相当于   quote_nullable)。

答案 1 :(得分:0)

你可以试试这个

"awesomeTypescriptLoaderOptions": {
  "useCache": true,
  "transpileOnly": true
}