sql 实现 字符串相邻重复去重,间隔重复留下

表中有字段
str num
a|b|a|a|b 10
想用sql变成
str num
a|b|a|b 10
求办法!!!

用正则表达式判断,然后用replace去重

(\w)\1{1,}

sql应该实现不了这种功能。写代码实现吧。

假设你有一个 Series 表,里面有一个字段 id 记录的是自然数 1-n
SQL Server 中,先截取子串,分隔各个子串,再用 lead 开窗判断是否是第一次出现,再按列拼接字符串即可。
MySQL 中思想一致,替换下具体的函数即可。
最后的聚合部分,根据你的表来,这里用的 num

select num, string_agg(substr1, '|') str
from
(select t.*
from
(SELECT str, num, row_number() over(order by id) id, 
            substring(str, id, charindex('|', str + '|', id) - id) substr1,
            lag(substring(str, id, charindex('|', str + '|', id) - id)) over(order by id) substr2
FROM tmp t1, series t2
where id = charindex('|', '|' + str, id)
)  t
where substr1 <> substr2 or substr2 is null) t
group by num

建议修改表结构,将str列的值拆分成一个关系表,把数据成分成一条条记录,就好查询和处理了