【问题标题】:Removing double quotes from concatenated string in plpgsql identifier从 plpgsql 标识符中的连接字符串中删除双引号
【发布时间】:2017-11-26 20:08:21
【问题描述】:

我编写了以下函数,该函数从另一个表“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 作为数字传递。

【问题讨论】:

    标签: sql postgresql dynamic plpgsql


    【解决方案1】:

    尝试更改为:

        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 是错误的(相当于 报价标识)。

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

    【讨论】:

    • 当然。不用担心
    【解决方案2】:

    你可以试试这个

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多