65.9K
CodeProject 正在变化。 阅读更多。
Home

MyGroupConcat:用于字符串连接的 MySQL UDF 聚合函数

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.47/5 (11投票s)

2003年6月23日

3分钟阅读

viewsIcon

89194

downloadIcon

680

这个 MySQL 扩展库提供了一个用于字符串连接的聚合函数(用于 SELECT...GROUP BY 子句)。

概述

这个 MySQL 扩展库提供了一个 用于字符串连接的聚合函数(用于 SELECT...GROUP BY 子句)。

组件特性

这个组件
  • 实现了一个用于字符串连接的聚合函数
  • 提供非常小的可执行文件:9 KB
  • 在 Windows XP 和 Windows 2000 Server 上运行
  • 使用 VC++ 7.0 (Visual Studio .NET) 编译
  • 可以作为用户定义函数 (UDF) group_concat() 插入 MySQL 中

用法

从 MySQL 使用这个组件

  • 创建函数 group_concat

    CREATE AGGREGATE FUNCTION group_concat RETURNS STRING SONAME "MyGroupConcat.dll";

  • 直接从 SQL 调用方法 group_concat()

    SELECT group_concat(first_name, ' ')
    FROM users
    GROUP BY id
    ;

示例代码 (SQL)

创建测试数据

    要创建并填充测试表 test_group_concat,请使用以下 SQL 脚本

    
    DROP TABLE IF EXISTS test_group_concat
    ;
    
    CREATE TABLE test_group_concat(
      id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
      code VARCHAR(8),
      label VARCHAR(255)
    )
    ;
    
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A01', '0LINE 1 LABEL')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A011', 'LINE 2 LABEL')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A0111', 'LINE 3 LABEL')
    ;
    
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A02', '0LINE 1 LABEL 2')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'A021', 'LINE 2 LABEL 2')
    ;
    
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B01', '0LINE 1 LABEL 3')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B011', 'LINE 2 LABEL 3')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0111', 'LINE 3 LABEL 3')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0111', 'LINE 4 LABEL 3')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0111', 'LINE 5 LABEL 3')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0111', 'LINE 6 LABEL 3')
    ;
    
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B02', '0LINE 1 LABEL 4 (nulls)')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B021', NULL)
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0211', NULL)
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0211', 'LINE 3 LABEL 4 (nulls)')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0211', 'LINE 5 LABEL 4 (nulls)')
    ;
    INSERT INTO test_group_concat(id, code, label) VALUES(NULL, 'B0211', 'LINE 6 LABEL 4 (nulls)')
    ;
    
    SELECT * FROM test_group_concat
    ;
          

    您将获得以下输出:

    id code label
    1 A01 0行 1 标签
    2 A011 行 2 标签
    3 A0111 行 3 标签
    4 A02 0行 1 标签 2
    5 A021 行 2 标签 2
    6 B01 0行 1 标签 3
    7 B011 行 2 标签 3
    8 B0111 行 3 标签 3
    9 B0111 行 4 标签 3
    10 B0111 行 5 标签 3
    11 B0111 行 6 标签 3
    12 B02 0行 1 标签 4 (nulls)
    13 B021
    14 B0211
    15 B0211 行 3 标签 4 (nulls)
    16 B0211 行 5 标签 4 (nulls)
    17 B0211 行 6 标签 4 (nulls)

仅显示 group_concat() 的输出

    
    SELECT
      group_concat(label) AS label
    FROM
      test_group_concat
    GROUP BY
      LEFT(code, 3)
    ;
          

    您将获得以下输出:

    label
    0行 1 标签行 2 标签行 3 标签
    0行 1 标签 2行 2 标签 2
    0行 1 标签 3行 2 标签 3行 3 标签 3行 4 标签 3行 5 标签 3行 6 标签 3
    0行 1 标签 4 (nulls)行 3 标签 4 (nulls)行 5 标签 4 (nulls)行 6 标签 4 (nulls)

显示 group_concat() 和 GROUP BY 子句的值

    您可以连接代码以相同 3 个字母开头的字段(例如,标签)

    
    SELECT
      LEFT(code, 3) AS code, group_concat(label) AS label
    FROM
      test_group_concat
    GROUP BY
      LEFT(code, 3)
    ;
          

    您将获得以下输出:

    code label
    A01 0行 1 标签行 2 标签行 3 标签
    A02 0行 1 标签 2行 2 标签 2
    B01 0行 1 标签 3行 2 标签 3行 3 标签 3行 4 标签 3行 5 标签 3行 6 标签 3
    B02 0行 1 标签 4 (nulls)行 3 标签 4 (nulls)行 5 标签 4 (nulls)行 6 标签 4 (nulls)

显示 group_concat()、GROUP BY 子句的值,并使用分隔符

    您还可以在连接过程中使用特定的分隔符(例如,下面的空格),就像 MySQL 的 CONCAT_WS 函数一样

    
    SELECT
      LEFT(code, 3) AS code, group_concat(label, ' ') AS label
    FROM
      test_group_concat
    GROUP BY
      LEFT(code, 3)
    ;
          

    在这种情况下,对于找到的每个字段值,分隔符都会被连接(除非字段值为 NULL,例如代码 'B02')

    code label
    A01 0行 1 标签 行 2 标签 行 3 标签
    A02 0行 1 标签 2 行 2 标签 2
    B01 0行 1 标签 3 行 2 标签 3 行 3 标签 3 行 4 标签 3 行 5 标签 3 行 6 标签 3
    B02 0行 1 标签 4 (nulls) 行 3 标签 4 (nulls) 行 5 标签 4 (nulls) 行 6 标签 4 (nulls)

实现

  • 实现基于 MySQL 示例代码(源代码发布)

待办事项

  • 提供其他字符串函数的聚合版本?
© . All rights reserved.