You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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最大的那条记录,就是完整的拼接结果

测试结果示例

针对你给出的样本数据,两种方法都会得到如下结果:

iddoc_numcombined_description
11This is the story about a girl named Daisy.
12Daisy had a dog named Rover.
21This story is about Bob.
22Bob is a DBA who works at an important company that de...

内容的提问来源于stack exchange,提问作者DB_G

火山引擎 最新活动