2013-10-03 68 views
0

我有如下表包含字符串值的三列。比較兩個字符串列,並導致第三列的SQL Server

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' 

現在,在最後一欄,我需要比較兩個列中的值並獲得具有strOriginal列的除了strNew值的所有值strFinal列結果值。

任何人都可以建議我該怎麼辦呢在SQL?

在此先感謝。

+0

誰生成此表?如果你有控制權,你可能會考慮有兩個表Orig和New,每個都帶有ID(不是pk)和str列。這將是更容易在SQL來管理,你除了這個查詢 – Dan

+0

@丹,我知道那使用,但我想導致在同一行同桌。事實上,我在多張桌子上進行處理後做了這張桌子,然後我在決賽桌上得到了這個結果。 –

+0

它取決於SQL Server的版本。還可以strNew包含不在附近的號碼?例如。對於ID = 1和strNew = '23,554',這給出了'strFinal ='122,234,22''。 – GriGrim

回答

2

填充你可以試試下面的查詢:

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

SQL FIDDLE

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

創建將轉動CSV值到表中的函數(參見this post爲一個很好的例子)

然後,設置一個觸發自動更新在INSERT/UPDATE第三列

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