SQL 字符串函数如何去掉重复字符?

SQL 字符串函数如何去掉重复字符?
最新回答
若樱落如烟

2026-10-23 18:08:51

在 SQL 中没有直接去除字符串重复字符的内置函数,但可通过递归 CTE、正则表达式拆分或自定义函数实现,不同数据库需选择适配方法。 以下是具体实现思路与示例:

一、递归 CTE 拆分并去重(SQL Server/PostgreSQL)

通过递归将字符串拆分为单个字符,去重后重新拼接。

  • 步骤:

    用递归 CTE 逐字符拆分字符串。

    使用 DISTINCT 去除重复字符。

    用 STRING_AGG(SQL Server 2017+/PostgreSQL)或等效函数拼接结果。

  • 示例(SQL Server):WITH Characters AS ( SELECT SUBSTRING('aabbcc', 1, 1) AS ch, 1 AS pos UNION ALL SELECT SUBSTRING('aabbcc', pos + 1, 1), pos + 1 FROM Characters WHERE pos < LEN('aabbcc'))SELECT STRING_AGG(ch, '') AS unique_stringFROM (SELECT DISTINCT ch FROM Characters) t;-- 结果:abc
二、正则表达式拆分去重(PostgreSQL/MySQL 8.0+)

利用正则拆分字符串为数组,去重后合并。

  • 步骤:

    用 regexp_split_to_array(PostgreSQL)或 REGEXP_SUBSTR(MySQL)拆分字符串。

    展开数组为行,去重后重新聚合。

  • 示例(PostgreSQL):SELECT STRING_AGG(DISTINCT letter, '' ORDER BY letter)FROM ( SELECT unnest(regexp_split_to_array('aabbcc', '')) AS letter) tWHERE letter != '';-- 结果:abc
三、自定义函数(通用方法)

创建用户定义函数封装去重逻辑,适合频繁使用场景。

  • 示例(SQL Server):CREATE FUNCTION dbo.RemoveDuplicateChars(@input NVARCHAR(MAX))RETURNS NVARCHAR(MAX)AS BEGIN DECLARE @result NVARCHAR(MAX) = ''; DECLARE @i INT = 1; DECLARE @ch NCHAR(1); WHILE @i <= LEN(@input) BEGIN SET @ch = SUBSTRING(@input, @i, 1); IF CHARINDEX(@ch, @result) = 0 SET @result = @result + @ch; SET @i += 1; END RETURN @result;END;-- 使用方式SELECT dbo.RemoveDuplicateChars('aabbcc'); -- 返回 abc
四、注意事项
  • 性能问题:递归或逐字符处理对长字符串效率低,建议避免在大表上使用。
  • 大小写敏感:默认区分大小写(如 'A' 和 'a'),需统一转换(如用 LOWER())若需忽略。
  • 替代方案:复杂场景建议在应用层(如 Python、Java)处理,性能更优。
五、不同数据库适配建议
  • MySQL:8.0+ 可用正则拆分(REGEXP_SUBSTR + 临时表),低版本需自定义函数。
  • Oracle:使用 REGEXP_SUBSTR 拆分,结合 LISTAGG 去重聚合。
  • SQLite:需依赖自定义函数或应用层处理。

根据实际数据库类型和需求选择合适方法,优先使用内置函数优化性能。