Oracle中结合多行成一行的合并函数(oracle中合并函数)

Oracle中结合多行成一行的合并函数

在Oracle数据库中,经常会遇到需要把多行数据合并成一行的情况。这种情况下,我们可以使用Oracle中的一些特殊的函数来实现。本文将介绍合并多行数据的三个主要的函数: listagg, wm_concat和xmlagg。

1. listagg函数

listagg函数是Oracle 11g版本新引入的函数,它可以把多行数据聚合成一个字符串。语法如下:

listagg(column_to_aggregate, delimiter) within group(order by column_order_by)

其中,column_to_aggregate指定要聚合的列,delimiter指定分隔符,column_order_by指定按照哪个列排序聚合后的字符串。例如,假设我们有一个表orders,包含以下数据:

order_id | product_name

———|————–

1 | iPhone 12

2 | Samsung Galaxy S21

1 | MacBook Air

3 | AirPods Pro

如果我们想把订单按照order_id合并成一行,可以使用以下SQL语句:

SELECT order_id, listagg(product_name, ‘, ‘) within group (order by product_name) as combined_products

FROM orders

GROUP BY order_id;

结果如下:

order_id | combined_products

———|——————-

1 | iPhone 12, MacBook Air

2 | Samsung Galaxy S21

3 | AirPods Pro

2. wm_concat函数

wm_concat函数是Oracle 10g版本提供的函数,它也可以把多行数据聚合成一个字符串。使用语法如下:

wm_concat(column_to_aggregate)

例如,假设我们有一个表students,包含以下数据:

id | name

—-|——-

1 | Tom

2 | David

1 | Jerry

3 | Mary

如果我们想把相同id的学生名字合并成一行,可以使用以下SQL语句:

SELECT id, wm_concat(name) as combined_names

FROM students

GROUP BY id;

结果如下:

id | combined_names

—-|—————-

1 | Tom, Jerry

2 | David

3 | Mary

需要注意的是,wm_concat函数并不官方支持,也不保证在所有版本的Oracle中都可用。

3. xmlagg函数

xmlagg函数也可以把多行数据合并成一行,它的返回结果是一个XML类型的数据。使用语法如下:

SELECT xmlagg(XMLElement(tagname, column_to_aggregate, delimiter).extract(‘//text()’) order by column_order_by) within group(order by column_order_by) as combined_data

FROM table_name

GROUP BY group_by_column;

其中,tagname指定XML标签名,column_to_aggregate指定要聚合的列,delimiter指定分隔符,column_order_by指定按照哪个列排序。例如,假设我们有一个表orders,包含以下数据:

order_id | product_name

———|————–

1 | iPhone 12

2 | Samsung Galaxy S21

1 | MacBook Air

3 | AirPods Pro

如果我们想把所有产品名字合并成一个XML节点,可以使用以下SQL语句:

SELECT xmlagg(XMLElement(‘product’, product_name, ‘, ‘).extract(‘//text()’) order by product_name) as combined_products

FROM orders;

结果如下:

COMBINED_PRODUCTS

————————————————————-

AirPods Pro, iPhone 12, MacBook Air, Samsung Galaxy S21

总结

在Oracle数据库中,有多种函数可以合并多行数据成一行。其中listagg函数是官方支持的并且可靠的函数,而wm_concat函数并不官方支持,并不保证在所有版本的Oracle中都可用。xmlagg函数可以把数据合并成一个XML节点,但相比于listagg函数,在处理大量数据时可能存在性能问题。


数据运维技术 » Oracle中结合多行成一行的合并函数(oracle中合并函数)