【发布时间】:2014-03-13 06:25:33
【问题描述】:
目前我有一个包含 52 个字段的表,但它会增长,我正在尝试编写一个动态 INSERT 语句,该语句将用 0 填充字段,而无需指定 52 个 0。
这是表格的缩减版:
CREATE TABLE tbladmin_reportsettings
(
intreportsettingsid integer NOT NULL,
strReportGroup character varying (20) NOT NULL,
ysnExcludePax1 smallint DEFAULT NULL,
ysnExcludePax3 smallint DEFAULT NULL,
ysnExcludePax2 smallint DEFAULT NULL,
ysnExcludePax4 smallint DEFAULT NULL,
ysnExcludePax5 smallint DEFAULT NULL,
ysnHideAgentABN smallint DEFAULT NULL,
CONSTRAINT pk_tbladmin_reportsettings PRIMARY KEY (intreportsettingsid)
)
INSERT 脚本是:
INSERT INTO tblAdmin_ReportSettings
VALUES
((select * from getautonumber('ReportSettingsID')),'Base',0,0,0,0,0);
列上的 DEFAULT NULL 是故意的,所以我不能简单地将其更改为 0。
我可以获得足够多的“0”重复字符串来填充插入的其余部分:
select string_agg(0::text,','::text) from information_schema.columns
WHERE table_name = 'tbladmin_reportsettings'
AND column_name NOT IN('intreportsettingsid', 'strreportgroup')
但它会将 string_agg 全部作为一个字段 - 我需要将它们拆分为单独的字段。
这是我的尝试:
INSERT INTO tblAdmin_ReportSettings
VALUES
(select (select * from getautonumber('ReportSettingsID')),'Base',
trim(string_agg('0',','),',')
from information_schema.columns
WHERE table_name = 'tbladmin_reportsettings'
AND column_name NOT IN('intreportsettingsid', 'strreportgroup')
)
但输出是:
column1 | column2 | column3
29 | Base | 0,0,0,0,0
而不是
column1 | column2 | column3 | column4 | column5 | column6 | column7
29 | Base | 0 | 0 | 0 | 0 | 0
我确实尝试创建一个数组并 unnest() 它,但结果是多行而不是多列。
有人可以提出一个可以使它工作的语法或函数吗?
【问题讨论】:
-
这是一个糟糕的设计。您不需要连续拥有所有属性,必须只有 4 个:
intreportsettingsid、strReportGroup、attributeName、attributeValue。例如。29 | Base | column3 | 0、29 | Base | column4 | 0等 -
@Alexander:这可能是糟糕的设计。但是你是在基本上没有信息的情况下做出判断的。如果所有列都已填满,您建议的设计将需要大约 25 倍的磁盘空间。如果大多数列保持为空 (0),您的模型将变得更有吸引力......
标签: sql postgresql plpgsql dynamic-sql sql-insert