Postgresql 如何将psql脚本变量替换为查询中的字符串,使其不会';无论变量是否设置,都不会失败

Postgresql 如何将psql脚本变量替换为查询中的字符串,使其不会';无论变量是否设置,都不会失败,postgresql,variables,psql,postgresql-9.6,string-substitution,Postgresql,Variables,Psql,Postgresql 9.6,String Substitution,我想要的是同一个查询不会失败——不管是否设置了变量。 然后根据设置的变量-返回相关输出 以下是我或多或少的意思/想法: --variable not set, returns not substituted string: SELECT 'solution=:abc' result; result --------------- solution=:abc --variable set: \set abc 5+7 SELECT 'solution=:abc' result;

我想要的是同一个查询不会失败——不管是否设置了变量。 然后根据设置的变量-返回相关输出

以下是我或多或少的意思/想法:

--variable not set, returns not substituted string:
SELECT 'solution=:abc' result;
    result     
---------------
 solution=:abc
--variable set:
\set abc 5+7
SELECT 'solution=:abc' result;
    result     
---------------
 solution=5+7
但在这两种情况下,变量都不会被替换:

SELECT 'solution=:abc' result;
    result     
---------------
 solution=:abc
--variable set:
\set abc 5+7
SELECT 'solution=:abc' result;
    result     
---------------
 solution=:abc
我发现我需要使用:'variable'语法,所以

SELECT 'solution=':'abc' result;
但是,这会在那里提供一个额外的(
)标志:

    result     
---------------
 solution='5+7
并且在未设置变量时不起作用

\unset abc
SELECT 'solution=':'abc' result;
ERROR:  syntax error at or near ":"
LINE 1: SELECT 'solution=':'abc' result;
发生什么事了

有没有办法让它在上面描述的两种情况下都能工作?
我使用的是PostgreSQL 9.6.11

psql的变量插值支持语法。如果要使用该变量

  • 一字不差地使用
    :abc
  • 作为字符串,使用
    :'abc'
  • 使用
    :“abc”
    (例如表格名称)作为标识符(例如表格名称)
你要做的是把两个字符串组合起来。因此,从语法上来说,正确的语法应该是:

选择'solution='| |:'abc'结果;
解释一下为什么你这样做的时候会有额外的报价

选择“解决方案=”:“abc”结果;
是不是
:'abc'
'5+7'
替换,导致

SELECT'解决方案=''5+7'结果;
双单引号是如何转义字符串中的单引号,从而转义输出中的单引号

至于在没有变量集的情况下如何使查询工作,我认为你运气不好。唯一的解决方法是将变量初始化为变量名本身:

db=# \set abc :abc
db=# SELECT 'solution=' || :'abc' result;
    result
---------------
 solution=:abc

我的回答对你有帮助吗?@fphilipe不是真的-它很好地解释了这是如何工作的,但本质上我是在寻找一种不会引起错误的东西,无论变量是否设置…