LISTAGG () 和STRING_AGG () 函数的区别与简单使用

1:区别

LISTAGG STRING_AGG 都是用于在 SQL 查询中将多个值合并为单个字符串的函数,但它们属于不同的数据库系统。

  • LISTAGG Oracle 数据库中的聚合函数,用于将多行的值合并为一个字符串,并且可以指定分隔符。
  • STRING_AGGSQL 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:用于分隔合并的值的分隔符。

3  示例:

假设我们有一个名为 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');

现在,让我们使用 LISTAGGSTRING_AGG 函数来合并员工姓名,并按部门进行分组:

3.1 在 Oracle 中使用 LISTAGG

SELECT department, LISTAGG(employee_name, ', ') 
WITHIN GROUP (ORDER BY employee_name) AS employees
FROM employees
GROUP BY department;

3.2 在 SQL Server 中使用 STRING_AGG

SELECT department, 
STRING_AGG(employee_name, ', ') AS employees
FROM employees
GROUP BY department;

3.3 查询结果

这些查询将根据部门将员工姓名合并为一个以逗号分隔的字符串。结果如下:

Department | Employees
-----------|---------------
Finance    | Eva
HR         | John, Mary
IT         | Alice, Bob

上述示例演示了如何使用 LISTAGGSTRING_AGG 函数在不同数据库系统中将多个值合并为一个字符串,并按部门分组。结果显示了每个部门及其对应的员工姓名。

猜你喜欢

转载自blog.csdn.net/XikYu/article/details/134005132
今日推荐