我需要类似于这两个SO问题,但使用Informix SQL语法.
使用SQL将多个字段连接成一个字段
SQL帮助:选择语句连接一对多关系
我的数据如下:
id codes 63592 PELL 58640 SUBL 58640 USBL 73571 PELL 73571 USBL 73571 SUBL
我希望看到它像这样回来:
id codes 63592 PELL 58640 SUBL, USBL 73571 PELL, USBL, SUBL
另请参见Informix中的group_concat().
我相信你需要的答案是用户定义的聚合,类似于这个:
CREATE FUNCTION gc_init(dummy VARCHAR(255)) RETURNING LVARCHAR; RETURN ''; END FUNCTION; CREATE FUNCTION gc_iter(result LVARCHAR, value VARCHAR(255)) RETURNING LVARCHAR; IF result = '' THEN RETURN TRIM(value); ELSE RETURN result || ',' || TRIM(value); END IF; END FUNCTION; CREATE FUNCTION gc_comb(partial1 LVARCHAR, partial2 LVARCHAR) RETURNING LVARCHAR; IF partial1 IS NULL OR partial1 = '' THEN RETURN partial2; ELIF partial2 IS NULL OR partial2 = '' THEN RETURN partial1; ELSE RETURN partial1 || ',' || partial2; END IF; END FUNCTION; CREATE FUNCTION gc_fini(final LVARCHAR) RETURNING LVARCHAR; RETURN final; END FUNCTION; CREATE AGGREGATE group_concat WITH (INIT = gc_init, ITER = gc_iter, COMBINE = gc_comb, FINAL = gc_fini);
给定一个元素表(称为元素),其中一个名为name的列包含(有趣的是)元素名称,另一列名为atomic_number,此查询产生以下结果:
SELECT group_concat(name) FROM elements WHERE atomic_number < 10; Hydrogen,Helium,Lithium,Beryllium,Boron,Carbon,Nitrogen,Oxygen,Fluorine
应用于该问题,您应该从以下方面获得所需的答案:
SELECT id, group_concat(codes) FROM anonymous_table GROUP BY id;
CREATE TEMP TABLE anonymous_table ( id INTEGER NOT NULL, codes CHAR(4) NOT NULL, PRIMARY KEY (id, codes) ); INSERT INTO anonymous_table VALUES(63592, 'PELL'); INSERT INTO anonymous_table VALUES(58640, 'SUBL'); INSERT INTO anonymous_table VALUES(58640, 'USBL'); INSERT INTO anonymous_table VALUES(73571, 'PELL'); INSERT INTO anonymous_table VALUES(73571, 'USBL'); INSERT INTO anonymous_table VALUES(73571, 'SUBL'); INSERT INTO anonymous_table VALUES(73572, 'USBL'); INSERT INTO anonymous_table VALUES(73572, 'PELL'); INSERT INTO anonymous_table VALUES(73572, 'SUBL'); SELECT id, group_concat(codes) FROM anonymous_table GROUP BY id ORDER BY id;
那个输出是:
58640 SUBL,USBL 63592 PELL 73571 PELL,SUBL,USBL 73572 PELL,SUBL,USBL
添加额外的数据集以测试插入序列是否影响结果; 它似乎没有这样做(代码按排序顺序;我不确定是否有办法改变 - 反向 - 该顺序).
笔记:
此聚合应该可用于任何可以转换为VARCHAR(255)的类型,这意味着任何数字或时间类型.不处理长CHAR列和blob类型(BYTE,TEXT,BLOB,CLOB).
普通的LVARCHAR将聚合大小限制为2048字节.如果您认为需要更长的长度,请指定LVARCHAR(10240)
(例如10 KiB).
从Informix 12.10.FC5开始,最大工作长度似乎是16380; 任何更长的东西似乎都会触发SQL -528: Maximum output rowsize (32767) exceeded
,这让我感到惊讶.
如果需要删除聚合,可以使用:
DROP AGGREGATE IF EXISTS group_concat; DROP FUNCTION IF EXISTS gc_fini; DROP FUNCTION IF EXISTS gc_init; DROP FUNCTION IF EXISTS gc_iter; DROP FUNCTION IF EXISTS gc_comb;