如何在 pl/pgsql 中声明具有特定列名的行文字?
Posted
技术标签:
【中文标题】如何在 pl/pgsql 中声明具有特定列名的行文字?【英文标题】:How to declare rows literal with specific column names in pl/pgsql? 【发布时间】:2021-11-26 04:26:07 【问题描述】:我想为表gangwei
声明一个数组变量bkgws
,其子集列名称为col1
和col2
,这是我尝试的方法:
DO $$
DECLARE
bkgws gangwei(col1, col2)[] := ('fo1','bar1'),('fo2','bar2'); -- here, syntax error
BEGIN
INSERT INTO gangwei (config_id, col1, col2) SELECT 1, col1, col2 FROM unnest(bkgws);
END;$$;
提供gangwei
的所有列都是id, config_id, col1, col2
。
文字('fo1','bar1'),('fo2','bar2')
是从应用层构建的。
【问题讨论】:
【参考方案1】:你需要先通过命令CREATE TYPE AS
创建复合类型
CREATE TYPE gangwei AS (col1 varchar, col2 varchar);
DO $$
DECLARE
bkgws gangwei[] DEFAULT '"(foo, bar)", "(foo2, bar2)"';
r record;
BEGIN
FOR r IN SELECT * FROM unnest(bkgws)
LOOP
RAISE NOTICE '% %', r.col1, r.col2;
END LOOP;
END;
$$;
NOTICE: foo bar
NOTICE: foo2 bar2
DO
【讨论】:
【参考方案2】:unpack
数组时需要指定列名:
... FROM unnest(bkgws) AS arr(col1,col2)
【讨论】:
以上是关于如何在 pl/pgsql 中声明具有特定列名的行文字?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 pl/pgsql 将具有动态元素名称的 JSON 数据转换为行?