You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计数据库表中逗号分隔多值列的元素数量?

解决逗号分隔邮箱列的总数统计问题

这个需求很典型,核心思路是把每行中逗号分隔的邮箱拆分成独立行,再统计总行数。下面针对几种常用的SQL数据库给出具体实现方案:

MySQL 解决方案

版本8.0.19及以上(支持STRING_SPLIT)

直接用内置的字符串拆分函数结合交叉连接,快速拆分并统计:

SELECT COUNT(*)
FROM Compose
CROSS JOIN STRING_SPLIT(emailID, ',')
-- 如果存在邮箱前后带空格的情况,加上TRIM过滤无效数据
-- WHERE TRIM(value) != ''

版本低于8.0.19(无STRING_SPLIT)

用递归CTE来逐段拆分字符串:

WITH RECURSIVE split_emails AS (
    SELECT 
        emailID,
        TRIM(SUBSTRING_INDEX(emailID, ',', 1)) AS email,
        TRIM(SUBSTRING(emailID, LENGTH(SUBSTRING_INDEX(emailID, ',', 1)) + 2)) AS remaining
    FROM Compose
    WHERE emailID IS NOT NULL AND emailID != ''
    UNION ALL
    SELECT 
        emailID,
        TRIM(SUBSTRING_INDEX(remaining, ',', 1)) AS email,
        TRIM(SUBSTRING(remaining, LENGTH(SUBSTRING_INDEX(remaining, ',', 1)) + 2)) AS remaining
    FROM split_emails
    WHERE remaining IS NOT NULL AND remaining != ''
)
SELECT COUNT(*) FROM split_emails;

PostgreSQL 解决方案

利用STRING_TO_ARRAY转数组,再用UNNEST展开为独立行:

SELECT COUNT(*)
FROM Compose
LATERAL UNNEST(STRING_TO_ARRAY(emailID, ',')) AS emails(email)
-- 处理空格和空值,避免统计无效数据
WHERE TRIM(email) != '';

SQL Server 解决方案

用STRING_SPLIT表值函数结合CROSS APPLY:

SELECT COUNT(*)
FROM Compose
CROSS APPLY STRING_SPLIT(emailID, ',')
-- 过滤空字符串和带空格的无效项
WHERE TRIM(value) != '';

注意事项

  • 如果你的数据中存在空行、空字符串或者邮箱前后带空格的情况,一定要加上TRIM和非空判断,避免统计无效数据。
  • 不同数据库的字符串处理函数略有差异,根据你使用的数据库选择对应的方案即可。

内容的提问来源于stack exchange,提问作者aman manhas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:17:40