Informix中基于ID拼接同列字符串的实现方法问询
在Informix中按ID分组拼接字符串的实现方法
你提到在MSSQL里这类字符串拼接需求很容易实现,在Informix里确实没有直接对应的系统级聚合函数,但我们可以通过两种实用方式来完成你的需求:
方法一:使用内置LIST()函数(Informix 11.50及以上版本)
如果你的Informix版本是11.50或更新,LIST()函数可以直接帮你完成分组拼接,还能指定拼接的排序顺序。针对你的需求,SQL语句如下:
SELECT id, doc_num, LIST(description ORDER BY page_num SEPARATOR ' ') AS combined_description FROM your_table_name GROUP BY id, doc_num;
关键说明:
LIST()会自动将分组内的description值按page_num升序排列,并用空格(SEPARATOR ' ')作为分隔符连接- 记得把
your_table_name替换成你的实际表名
方法二:递归CTE实现(兼容低版本Informix)
如果你的Informix版本不支持LIST(),可以用递归公共表表达式(CTE)来逐个拼接字符串:
WITH RECURSIVE cte AS ( -- 基础查询:获取每个(id, doc_num)组的第一条记录(page_num最小的) SELECT id, doc_num, page_num, description AS combined_desc FROM your_table_name t1 WHERE page_num = (SELECT MIN(page_num) FROM your_table_name t2 WHERE t2.id = t1.id AND t2.doc_num = t1.doc_num) UNION ALL -- 递归查询:依次拼接后续page_num的记录 SELECT c.id, c.doc_num, t.page_num, c.combined_desc || ' ' || t.description AS combined_desc FROM cte c JOIN your_table_name t ON c.id = t.id AND c.doc_num = t.doc_num AND t.page_num = c.page_num + 1 ) -- 取每个(id, doc_num)组的最后一条拼接结果(page_num最大的) SELECT id, doc_num, combined_desc AS combined_description FROM cte c WHERE page_num = (SELECT MAX(page_num) FROM your_table_name t WHERE t.id = c.id AND t.doc_num = c.doc_num) ORDER BY id, doc_num;
关键说明:
- 递归CTE先定位每个分组的起始记录,然后逐步拼接下一个
page_num的内容 - 使用Informix的字符串连接操作符
||来拼接文本,中间加空格分隔 - 最后筛选出每个分组中
page_num最大的那条记录,就是完整的拼接结果
测试结果示例
针对你给出的样本数据,两种方法都会得到如下结果:
| id | doc_num | combined_description |
|---|---|---|
| 1 | 1 | This is the story about a girl named Daisy. |
| 1 | 2 | Daisy had a dog named Rover. |
| 2 | 1 | This story is about Bob. |
| 2 | 2 | Bob is a DBA who works at an important company that de... |
内容的提问来源于stack exchange,提问作者DB_G




