次のような結果が得られる列があります。
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