Che*_*eso 6 sql informix concatenation one-to-many group-concat
我需要类似于这两个SO问题,但使用Informix SQL语法.
我的数据如下:
id codes
63592 PELL
58640 SUBL
58640 USBL
73571 PELL
73571 USBL
73571 SUBL
Run Code Online (Sandbox Code Playgroud)
我希望看到它像这样回来:
id codes
63592 PELL
58640 SUBL, USBL
73571 PELL, USBL, SUBL
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 19
我相信你需要的答案是用户定义的聚合,类似于这个:
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);
Run Code Online (Sandbox Code Playgroud)
给定一个元素表(称为元素),其中一个名为name的列包含(有趣的是)元素名称,另一列名为atomic_number,此查询产生以下结果:
SELECT group_concat(name) FROM elements WHERE atomic_number < 10;
Hydrogen,Helium,Lithium,Beryllium,Boron,Carbon,Nitrogen,Oxygen,Fluorine
Run Code Online (Sandbox Code Playgroud)
应用于该问题,您应该从以下方面获得所需的答案:
SELECT id, group_concat(codes)
FROM anonymous_table
GROUP BY id;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
那个输出是:
58640 SUBL,USBL
63592 PELL
73571 PELL,SUBL,USBL
73572 PELL,SUBL,USBL
Run Code Online (Sandbox Code Playgroud)
添加额外的数据集以测试插入序列是否影响结果; 它似乎没有这样做(代码按排序顺序;我不确定是否有办法改变 - 反向 - 该顺序).
笔记:
LVARCHAR(10240)(例如10 KiB).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;
Run Code Online (Sandbox Code Playgroud)