2014-10-30 107 views
0

我目前遇到了一个可能具有简单解决方案的挑战,但不知何故,我无法想出它。SQL Server:通过查找其他表替换字段中的值

我有被格式化两个字段表A如下:

[ID] [Codes] 
1  A;B 
2  D 
3  A;C 

表B格式如下:

[ID] [Codes] 
A  Apple 
B  Orange 
C  Pear 
D  Strawberry 

我想这样做是查找/替换为了生成以下输出

a.[ID] a.[Parsed_Codes] 
    1  Apple;Orange 
    2  Strawberry 
    3  Apple;Pear 

总之我想代替表A中的代码,在表B中与这些代码相关联的值。

当然,我可以只写一个长替换语句(在我的情况下有几百个代码),但这似乎是一种效率极低的方法。

谢谢!

回答

1

简单的方法是通过将表A [代码] column data(csv) into separate rows. 然后与表B加入,以获得各自的代码。最后convert the rows to CSV得到结果。尝试这个。

CREATE TABLE #tablea 
    ([ID] INT,[Codes] VARCHAR(100)) 

INSERT INTO #tablea 
VALUES  (1,'A;B'),(2,'D'),(3,'A;C') 

CREATE TABLE #tableB 
    ([ID] VARCHAR(100),[Codes] VARCHAR(100)) 

INSERT INTO #tableb 
VALUES  ('A','Apple'),('B','Orange'), 
      ('C','Pear'),('D','Strawberry') 

SELECT a.id, 
     a.Codes old_code, 
     b.Codes Parsed_Codes 
INTO #final 
FROM #tableb b 
     JOIN (SELECT id, 
        codes, 
        Split.a.value('.', 'VARCHAR(100)') [new_Codes] 
      FROM (SELECT id, 
          [Codes], 
          Cast ('<M>' + Replace([Codes], ';', '</M><M>') 
            + '</M>' AS XML) AS Data 
        FROM #tablea) AS A 
        CROSS APPLY Data.nodes ('/M') AS Split(a)) a 
     ON a.new_Codes = b.id 

SELECT t1.ID, 
     old_code, 
     Stuff((SELECT '; ' + CONVERT(VARCHAR, Parsed_Codes) 
       FROM #final b 
       WHERE b.ID = t1.ID 
       FOR XML PATH('')), 1, 2, '') 
FROM #final t1 
GROUP BY t1.id, 
      old_code 

OUTPUT

ID old_code Parsed_Codes 
-- -------- ------------ 
1 A;B   Apple; Orange 
2 D   Strawberry 
3 A;C   Apple; Pear 

(注:临时表,可避免为了避免混淆代码我用临时表)

+0

由于普拉迪普。像魅力一样工作! – 2014-10-30 10:32:48

0

首先创建此函数..它用于将分隔字符串拆分为变量表。然后,我们可以使用此函数来确定另一个表中的代码,并使用STUFF函数将它们作为一个字符串返回。

CREATE FUNCTION [dbo].[fnSplitString] 
    (
    @string NVarchar(MAX) 
    ,@delimiter Char(1) = ',' 
    ) 
RETURNS @t TABLE (string NVarchar(MAX)) 
AS 
BEGIN 
    DECLARE @pos Int 
    DECLARE @piece Varchar(500) 

    IF RIGHT(RTRIM(@string), 1) <> @delimiter 
     SET @string = @string + @delimiter 

    SET @pos = PATINDEX('%' + @delimiter + '%', @string) 
    WHILE @pos <> 0 
     BEGIN 
     SET @piece = LEFT(@string, @pos - 1) 
     INSERT @t 
        SELECT @piece 

     SET @string = STUFF(@string, 1, @pos, '') 
     SET @pos = PATINDEX('%' + @delimiter + '%', @string) 
     END 

    RETURN 
END 

然后运行下面的查询......

DECLARE @result TABLE 
    (
    [ID] Int 
    ,[CommaDelimitedCodes] Varchar(500) 
    ) 
DECLARE @codes TABLE 
    (
    [ID] Varchar(500) 
    ,[FullNames] Varchar(500) 
    ) 
INSERT INTO @result 
     SELECT 1 
       ,'A;B' 
INSERT INTO @result 
     SELECT 2 
       ,'D' 
INSERT INTO @result 
     SELECT 3 
       ,'A;C' 

INSERT INTO @codes 
     SELECT 'A' 
       ,'Apple' 
INSERT INTO @codes 
     SELECT 'B' 
       ,'Orange' 
INSERT INTO @codes 
     SELECT 'C' 
       ,'Pear' 
INSERT INTO @codes 
     SELECT 'D' 
       ,'Strawberry' 

SELECT * 
     ,STUFF((
       SELECT ', ' + [FullNames] 
       FROM @codes t 
       WHERE id IN (SELECT * 
           FROM dbo.fnSplitString(r.[CommaDelimitedCodes], ';')) 
       FOR 
       XML PATH('') 
       ), 1, 2, '') AS taglist 
FROM  @result AS r 

我创建了两个变量表来测试 - 但显然你的情况,你需要替换那些在你的表实际字段名。