2012-08-15 48 views
0

名單我有一列,可以有如下所示的結果:動態字符串替換在2005年SQL

ER 

ER,ER,ER 

ER,ER,OR,OR 

OR 

OR,OR 

OR,OR,OR,ER,ER 

我正在尋找一種方式來代替任何一個字符串,如"ER,ER,ER,OR,OR"只是"ER,OR"。不管EROR出現多少次,我只是希望每個顯示一次。謝謝

回答

0

一種快速和骯髒的方式會是這樣的......雖然它僅限於您在問題中提供的示例。從概念上來說,知識管理對你的問題的評論提供了更好的方法。

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 
+0

我不確定這是一個安全的假設,只有兩個值。添加更多的值,這個更新語句變得非常複雜,非常快。 :-) – 2012-08-15 18:08:55

+0

同意了,爲什麼我說它僅限於在問題中提出的方案 – RThomas 2012-08-15 18:18:26

+0

只是想說明情況,以免人們在沒有閱讀上下文的情況下獲取代碼,評論可能會有所幫助。 :-) – 2012-08-15 18:19:35

1

創建分割功能(或搜索本網站數以百計的變化):

CREATE FUNCTION [dbo].[SplitStrings_XML] 
(
    @List  NVARCHAR(MAX), 
    @Delimiter NVARCHAR(255) 
) 
RETURNS TABLE 
WITH SCHEMABINDING 
AS 
    RETURN 
    ( 
     SELECT Item = y.i.value('(./text())[1]', '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('.[1]', '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