0

我有一列可以产生如下结果:

ER

ER,ER,ER

ER,ER,OR,OR

OR

OR,OR

OR,OR,OR,ER,ER

我正在寻找一种方法来替换任何字符串,"ER,ER,ER,OR,OR"例如"ER,OR". 无论出现多少次EROR出现,我只希望每个只显示一次。谢谢

4

2 回答 2

1

创建一个拆分函数(或在此站点上搜索数百个变体):

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
于 2012-08-15T17:57:41.463 回答
0

一种快速而肮脏的方式是这样的......尽管它仅限于您在问题中提供的示例。从概念上讲,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
于 2012-08-15T17:54:18.190 回答