0

我有下表,其中三列包含字符串值。

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'

现在在最后一列中,我需要比较两列值并在 strFinal 列中获取结果值,该列具有除 strNew 值之外的 strOriginal 列的所有值。

谁能建议我如何在 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

下面是可能有帮助的链接。 从 SQL Server 中的字符串中删除子字符串的第二次出现

但是,在此链接中,字符串由“/”分隔,您可以在其中替换“,”,并且还需要稍作修改。

于 2013-10-03T08:39:09.067 回答
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 上自动更新第三列

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 回答