LISTAGG
和 STRING_AGG
都是用于在 SQL 查询中将多个值合并为单个字符串的函数,但它们属于不同的数据库系统。
LISTAGG
是 Oracle 数据库中的聚合函数,用于将多行的值合并为一个字符串,并且可以指定分隔符。STRING_AGG
是 SQL Server 中的聚合函数,也用于将多行的值合并为一个字符串,并且可以指定分隔符。2:
语法结构2.1 LISTAGG
函数的语法结构如下:- LISTAGG(expression, delimiter) WITHIN GROUP
- (ORDER BY order_expression) [OVER (analytic_clause)]
expression
:要合并的表达式,通常是一个列或计算值。delimiter
:用于分隔合并的值的分隔符。ORDER BY order_expression
:可选部分,用于指定合并的顺序。如果不提供 ORDER BY
子句,合并的顺序将不受控制。analytic_clause
:可选部分,通常用于窗口函数。在常规用法中,这部分通常不会出现。2.2 STRING_AGG
函数的语法结构如下: STRING_AGG (expression, separator)
expression
:要合并的表达式,通常是一个列或计算值。separator
:用于分隔合并的值的分隔符。假设我们有一个名为 employees
的表,包含以下字段:
employee_id
(员工ID)employee_name
(员工姓名)department
(所属部门)以下是表结构示例:
- CREATE TABLE employees (
- employee_id INT,
- employee_name VARCHAR(50),
- department VARCHAR(50)
- );
-
- INSERT INTO employees (employee_id, employee_name, department)
- VALUES
- (1, 'John', 'HR'),
- (2, 'Alice', 'IT'),
- (3, 'Bob', 'IT'),
- (4, 'Mary', 'HR'),
- (5, 'Eva', 'Finance');
现在,让我们使用 LISTAGG
和 STRING_AGG
函数来合并员工姓名,并按部门进行分组:
- SELECT department, LISTAGG(employee_name, ', ')
- WITHIN GROUP (ORDER BY employee_name) AS employees
- FROM employees
- GROUP BY department;
- SELECT department,
- STRING_AGG(employee_name, ', ') AS employees
- FROM employees
- GROUP BY department;
这些查询将根据部门将员工姓名合并为一个以逗号分隔的字符串。结果如下:
- Department | Employees
- -----------|---------------
- Finance | Eva
- HR | John, Mary
- IT | Alice, Bob
上述示例演示了如何使用 LISTAGG
和 STRING_AGG
函数在不同数据库系统中将多个值合并为一个字符串,并按部门分组。结果显示了每个部门及其对应的员工姓名。