簡體   English   中英

SQL Server:通過查找其他表替換字段中的值

[英]SQL Server: Replace values in field via lookup other table

我目前正面臨一個可能有一個簡單解決方案的挑戰,但是以某種方式我無法提出它。

我有表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

簡而言之,我想用與表B中的那些代碼關聯的值替換表A中的代碼。

當然,我可以編寫一個長的replace語句(在我的情況下,有幾百個代碼),但這似乎是一種效率極低的方法。

謝謝!

簡單的方法是將表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 

輸出值

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

(注意:可以避免使用臨時表,以避免我在使用臨時表時出現代碼混淆)

首先創建此函數。它用於將定界字符串拆分為變量表。 然后,我們將能夠使用此函數從另一張表中確定代碼,並使用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  

我創建了兩個變量表進行測試-但顯然,在您的情況下,您需要用表中的實際字段名稱替換這些變量表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM