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 に答える