在 SQL 中没有直接去除字符串重复字符的内置函数,但可通过递归 CTE、正则表达式拆分或自定义函数实现,不同数据库需选择适配方法。 以下是具体实现思路与示例:
一、递归 CTE 拆分并去重(SQL Server/PostgreSQL)通过递归将字符串拆分为单个字符,去重后重新拼接。
二、正则表达式拆分去重(PostgreSQL/MySQL 8.0+)利用正则拆分字符串为数组,去重后合并。
三、自定义函数(通用方法)创建用户定义函数封装去重逻辑,适合频繁使用场景。
- 示例(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:需依赖自定义函数或应用层处理。
根据实际数据库类型和需求选择合适方法,优先使用内置函数优化性能。