0

次の表には、文字列値を含む 3 つの列があります。

ID       strOriginal                  strNew                 strFinal
1        '122,234,23,22,554'          '23,22'               '122,234,554'
2        '122,23,22,554,998,856,996'  '554,998,856,996'     '122,23,22'
3        '60,89,65,87,445,54'         '87'                  '60,89,65,445,54'

最後の列では、2 つの列の値を比較し、strNew 値を除く strOriginal 列のすべての値を持つ strFinal 列で結果値を取得する必要があります。

誰かがSQLでそれを行う方法を提案できますか?

4

4 に答える 4

2

以下のクエリを試すことができます:

select *,
case when patindex('%'+STRNEW+'%',STRORIGINAL)>=1 
     then replace(replace (STRORIGINAL,STRNEW,''),',,',',') 
     else STRORIGINAL 
end final_String
from table1

SQL フィドル

于 2013-10-03T10:27:44.810 に答える
0

以下を試してください。最初にテーブル名([Table_3])を自分のものに置き換えてください。

 DECLARE @S      varchar(max),
         @S1     varchar(max),
         @Split  char(1),
         @X      xml,
         @X1     xml;

  SET @Split = ',';

  SELECT @S  = [strOriginal] FROM [Table_3] Where id=2;  
  SELECT @S1 = [strNew] FROM [Table_3] Where id=2;

  SELECT @X = 
  CONVERT(xml,' <root> <s> ' + REPLACE(@S,@Split,'</s> <s>') + ' </s> </root> ')

  SELECT @X1 = 
  CONVERT(xml,' <root> <s> ' + REPLACE(@S1,@Split,'</s> <s>') + ' </s> </root> ')

  Select * From 
   (
      SELECT [Value] = LTrim(T.c.value('.','varchar(20)'))
      FROM @X.nodes('/root/s') T(c)
   ) 
   As CollectionVal
   Where [Value] Not In 
   (
      SELECT [Value1] = LTrim(T1.c1.value('.','varchar(20)'))
      FROM @X1.nodes('/root/s') T1(c1)
   )
于 2013-10-03T08:59:55.470 に答える
0

CSV 値をテーブルに変換する関数を作成します (この良い例については、この投稿を参照してください)。

次に、INSERT / UPDATE で 3 列目を自動的に更新するトリガーを設定します。

CREATE TRIGGER INS_TempData
   ON  TempData
   AFTER INSERT, UPDATE
AS 
BEGIN
    --This will ONLY work against a single row at a time.  It will need to be modified to work with bulk operations
    SET NOCOUNT ON;
    --Declare are placeholders
    DECLARE @original varchar(200)
    DECLARE @new varchar(200)
    DECLARE @final varchar(200)
    DECLARE @id int
    --Populate our variables with the inserted values
    SELECT @id = id, @Original = stroriginal, @new = strnew FROM INSERTED   
    SELECT @final = SUBSTRING(
    (SELECT ',' + a.value from [dbo].[UTILfn_Split](@original,',') a
    LEFT JOIN [dbo].[UTILfn_Split](@new,',') b on a.value = b.value
    --Eliminate the strNew values from the result
    WHERE b.value IS NULL
    FOR XML PATH('')
    ),2,200000) 
    --Update the table with the final value
    UPDATE TempData SET strFinal = @final where id = @id
END
GO

注:TempDataテーブルの名前に変更します

次に、新しいデータを挿入すると

INSERT INTO TEMPDATA(STRORIGINAL, STRNEW) VALUES ('122,234,23,22,554' ,'23,22')

StrFinal自動的に入力されます122,234,554

于 2013-10-03T09:27:26.017 に答える
0

以下は参考になりそうなリンクです。 SQL Server の文字列から部分文字列の 2 番目の出現を削除します

ただし、このリンク文字列は「/」で区切られており、「,」に置き換えることができ、わずかな変更も必要です。

于 2013-10-03T08:39:09.067 に答える