如何使用 Postgresql psql \set 变量构建包含下划线的 SQL 标识符?

问题描述 投票:0回答:1

PG 14.11

这非常有效:

CDSLBXW=# \set sch public
CDSLBXW=# \set tbl job_history
CDSLBXW=# \set fld job_id
CDSLBXW=# CREATE INDEX CONCURRENTLY IF NOT EXISTS blarge ON :sch.:tbl (:fld) WITH (fillfactor=100);
CREATE INDEX

但是,我不想要名为“blarge”的索引。目标是从表和字段名称构建有意义的索引名称,但下划线会导致它失败:

CDSLBXW=# CREATE INDEX CONCURRENTLY IF NOT EXISTS tmpidx_:tbl_:fld ON :sch.:tbl (:fld) WITH (fillfactor=100);
ERROR:  syntax error at or near ":"
LINE 1: CREATE INDEX CONCURRENTLY IF NOT EXISTS tmpidx_:tbl_job_id O...

                                                   ^

在 bash 中,您可以使用大括号来分隔变量名称,但这些在 psql 中不可用。

该怎么办?

postgresql psql postgresql-14
1个回答
0
投票

在这种情况下,您可以借助PL/pgSQL来动态生成SQL语句。

您可以使用以下代码 `--设置变量 \设置 sch 公共 \set tbl job_history \设置 fld job_id

-- 使用变量创建索引 做$$ 开始 执行格式('如果不存在则并发创建索引 %I ON %I.%I (%I) WITH (fillfactor=100);', :sch || '' || :tbl || '' || : fld || '_idx',:sch,:tbl,:fld); 结束 $$; ` 根据您的需要调整变量。

© www.soinside.com 2019 - 2024. All rights reserved.