名單我有一列,可以有如下所示的結果:動態字符串替換在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"
。不管ER
或OR
出現多少次,我只是希望每個顯示一次。謝謝
名單我有一列,可以有如下所示的結果:動態字符串替換在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"
。不管ER
或OR
出現多少次,我只是希望每個顯示一次。謝謝
一種快速和骯髒的方式會是這樣的......雖然它僅限於您在問題中提供的示例。從概念上來說,知識管理對你的問題的評論提供了更好的方法。
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
創建分割功能(或搜索本網站數以百計的變化):
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
我不確定這是一個安全的假設,只有兩個值。添加更多的值,這個更新語句變得非常複雜,非常快。 :-) – 2012-08-15 18:08:55
同意了,爲什麼我說它僅限於在問題中提出的方案 – RThomas 2012-08-15 18:18:26
只是想說明情況,以免人們在沒有閱讀上下文的情況下獲取代碼,評論可能會有所幫助。 :-) – 2012-08-15 18:19:35