问题:
您遇到数据表现出一对多关系,并且您希望以更加结构化和可读的方式表示它。具体来说,您希望将包含唯一 ID 和逗号分隔值列表的列的表转换为每个不同值显示在单独列中的表。
Informix SQL 解决方案:
Informix SQL 中推荐的方法是使用用户定义的聚合函数。虽然 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);
用法:
创建聚合后,您可以在查询中利用它来实现所需的转换:
SELECT id, group_concat(codes) FROM anonymous_table GROUP BY id;
示例:
让我们考虑一个名为的示例表onymous_table:
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');
将上述查询应用于此表将产生以下输出:
58640 SUBL,USBL 63592 PELL 73571 PELL,SUBL,USBL
这演示了聚合函数如何有效地分组和连接与每个唯一 ID 关联的代码,以更有条理的方式呈现数据。
以上是如何在 Informix SQL 中将一对多关系转换为不同的列?的详细内容。更多信息请关注PHP中文网其他相关文章!