在 Oracle 中不使用存储过程将多行连接成一行
在 Oracle 中处理数据时,可能会出现以下情况:需要将多行合并为一行。传统上,这可以使用存储过程来实现。不过,有一种更高效、更直接的解决方案,即使用 Oracle 的 LISTAGG 子句。
Oracle 中的 LISTAGG 子句
在 Oracle 11gR2 中引入,LISTAGG 子句允许您串联多个值合并到一个字符串中。它采用以下语法:
LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY column)
示例
考虑以下数据集:
question_id | element_id |
---|---|
1 | 7 |
1 | 8 |
2 | 9 |
3 | 10 |
3 | 11 |
3 | 12 |
连接将每个 Question_id 的 element_id 值放入一行中,我们可以使用以下查询:
SELECT question_id, LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) FROM your_table GROUP BY question_id;
输出
question_id | element_id |
---|---|
1 | 7,8 |
2 | 9 |
3 | 10,11,12 |
大结果的注意事项Strings
如果结果字符串预计超过4000 个字符(VARCHAR2 数据类型的最大长度),您可以使用 Oracle 12cR2 中引入的以下增强功能:
SELECT question_id, LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) ON OVERFLOW TRUNCATE/ERROR FROM your_table GROUP BY question_id;
以上是在 Oracle 中,如何在不使用存储过程的情况下将多行连接成一行?的详细内容。更多信息请关注PHP中文网其他相关文章!