我有一列可以产生如下结果:
ER
ER,ER,ER
ER,ER,OR,OR
OR
OR,OR
OR,OR,OR,ER,ER
我正在寻找一种方法来替换任何字符串,"ER,ER,ER,OR,OR"
例如"ER,OR"
. 无论出现多少次ER
或OR
出现,我只希望每个只显示一次。谢谢
我有一列可以产生如下结果:
ER
ER,ER,ER
ER,ER,OR,OR
OR
OR,OR
OR,OR,OR,ER,ER
我正在寻找一种方法来替换任何字符串,"ER,ER,ER,OR,OR"
例如"ER,OR"
. 无论出现多少次ER
或OR
出现,我只希望每个只显示一次。谢谢
创建一个拆分函数(或在此站点上搜索数百个变体):
CREATE FUNCTION [dbo].[SplitStrings_XML]
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value(N'./text()[1]', N'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')
) AS a
CROSS APPLY x.nodes('i') AS y(i)
);
GO
然后你可以这样做:
DECLARE @x TABLE(foo VARCHAR(32));
INSERT @x SELECT 'ER'
UNION ALL SELECT 'ER,ER,ER'
UNION ALL SELECT 'ER,ER,OR,OR'
UNION ALL SELECT 'OR'
UNION ALL SELECT 'OR,OR'
UNION ALL SELECT 'OR,OR,OR,ER,ER';
;WITH g AS
(
SELECT x.foo, s.Item
FROM @x AS x
CROSS APPLY dbo.SplitStrings_XML(x.foo, ',') AS s
GROUP BY x.foo, s.Item
)
SELECT original = x.foo, new = STUFF((SELECT ',' + Item FROM g
WHERE foo = x.foo GROUP BY Item
FOR XML PATH(''),
TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 1, '')
FROM @x AS x;
结果几乎完全符合您的要求,除了不保留初始字符串的顺序:
original new
----------------- ----------
ER ER
ER,ER,ER ER
ER,ER,OR,OR ER,OR
OR OR
OR,OR OR
OR,OR,OR,ER,ER ER,OR
一种快速而肮脏的方式是这样的......尽管它仅限于您在问题中提供的示例。从概念上讲,KM 对您的问题的评论中提供了更好的方法。
update mytable
set mycolumn =
case when (mycolumn like '%er%' and not mycolumn like '%or%') then 'ER'
when (mycolumn like '%or%' and not mycolumn like '%er%') then 'OR'
when (mycolumn like '%er%' and mycolumn like '%or%') then 'ER,OR' end