【问题标题】:How to escape a percent sign in "EXECUTE format('blah')"如何在“执行格式('blah')”中转义百分号
【发布时间】:2021-07-01 08:49:45
【问题描述】:

我有两张桌子,例如:

CREATE TABLE table_1
(
    one_column   INTEGER,
    two_column   INTEGER,
    three_column INTEGER
);

CREATE TABLE table_2
(
    id        SERIAL,
    column_1  INTEGER,
    column_2  INTEGER,
    column_3  INTEGER,
    name      TEXT,
    step      INTEGER
);

我还有一个存储函数,它接收许多参数。在函数中,我使用EXECUTE format() 的调用将INSERT 的一行插入到一个表中,类似这样...

CREATE OR REPLACE PROCEDURE function_p (
    p_name TEXT DEFAULT '',
    p_step INT DEFAULT NULL
    )
LANGUAGE plpgsql AS $$
BEGIN
  EXECUTE format('
    INSERT INTO table_2 (column_1,column_2,column_3,name,step)
    SELECT one_column, two_column,three_column,%L,%s
    FROM table_1',p_name,p_step);   
END;
$$

(感谢@jim-jones)

但是,在我的“实际”函数中,INNER JOINSELECT 中也有一个类似于以下条件的内容...

    ON (month_diff(d, now()::DATE) % month_interval) = 0

我收到类似 unrecognized format() type specifier " " 之类的错误,我想我是否需要转义 '%' 符号,如果需要,如何转义?是“\%”还是“%%”还是别的什么?我已经尝试过这些并得到同样的失败。

【问题讨论】:

  • %% 应该可以工作:你在这里得到了什么? SELECT FORMAT('%s%%',1)
  • 来自documentation:如果要在结果字符串中包含 %,请使用双百分比 %%。既然您已经尝试过了,也许您可​​以尝试\%% 甚至%%%
  • 你想计算模数?
  • 抱歉,我试过%% 并没有注意到它正在工作,因为我的废话代码中出现了另一个错误。愚蠢的截止日期和疲惫的开发人员在这里......谢谢大家

标签: sql postgresql plpgsql


【解决方案1】:

您的问题肯定出在其他地方。 %% 成功了:

SELECT
  format('%s%%',42),
  format('%1s%%',42),
  format('%2$s%% - %1$s%%',42,73); -- $ index for customized order

 format | format |  format   
--------+--------+-----------
 42%    | 42%    | 73% - 42%
(1 row)

the documentation中提到了这个:

除了上述格式说明符之外,特殊序列%% 可用于输出文字% 字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多