如何获得带有附加特殊字符的 sql 的输出

How to get output of a sql with additional special characters

说来话长...

我正在尝试动态生成交叉表查询并将其运行 作为 psql 脚本..

为此,我希望生成 sql 的最后一行并将其附加到 sql 的顶部。

sql的最后一行是这样的.... "as final_result(symbol character varying,"431" numeric,"432" numeric,"433" numeric);

其中,“431”、“432”等是动态生成的,因为它们是数据透视列,它们会不时变化...

所以我写了一个查询输出文本如下....

psql -c "select distinct '"'||runweek||'" numeric ,' from calendar where runweek between current_runweek()-2 and current_runweek() order by 1;" -U USER -d DBNAME > /tmp/gengen.lst

虽然 sql 提供了输出,但当我 运行 它作为脚本时,由于特殊字符 (', "", ) 它失败了。

我应该如何让它工作?然后我的计划是遍历 "lst" 文件并构建数据透视字符串,并将其附加到 sql 的顶部并执行脚本...(postgres 新手,不知道,动态sql 生成和执行等。但我对 UNIX 脚本很满意。)

如果我能以某种方式得到输出 ("431" numeric, "432" numeric.....etc) 一步到位,如果有推荐实现这个,将不胜感激.....

由于您在参数周围使用双引号,因此参数中的双引号必须使用反斜杠进行转义:

psql -c "select distinct '\"'||runweek||'\" numeric ,' from calendar where runweek between current_runweek()-2 and current_runweek() order by 1;"

也可以使用Heredoc代替-c。它接受多行格式,使整个内容更具可读性。

(psql [arguments] <<EOF
  select distinct '"'||runweek||'" numeric ,'
     from calendar 
     where runweek between current_runweek()-2 and current_runweek()
   order by 1;
EOF
) > output

通过使用专门用于从文本值生成带引号的标识符的 quote_ident,您甚至不需要添加双引号。查询可能是这样的:

select string_agg( quote_ident(runweek::text), ',' order by runweek)
 from calendar
 where runweek between current_runweek()-2 and current_runweek();

这也解决了您的原始查询末尾有一个杂散的“,”而此表单没有的问题。