簡體   English   中英

SQL用相應的值替換數組字段

[英]SQL replace array field with corresponding values

我有2個SQL表,類似於下面的表:

table_a:

ID | Scenarios
1    1;2;3;4;
2    3;4

table_scenarios:

ID | Unit
1    A
2    B
3    C
4    D

我想要做的是制作一條SQL語句,該語句應將table_a字段場景中的值替換為table_scenarios中的相應值。輸出應如下所示:

ID | Scenarios
1    A;B;C;D;
2    C;D;

不使用VBA編碼如何實現?

免責聲明:正如評論正確指出的那樣,這遠不是一種優化的數據結構方式。 嚴格地,您應該重組表,但是如果您被限制以這種方式進行操作,則可以進行以下工作。

使用字符串拆分表值函數(從SQL Server Central復制)

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

使用以下查詢后,您可以獲得所需的結果:

;
WITH    CTE_Units
          AS (
              SELECT    ta.ID,
                        ts.Unit
              FROM      #table_a AS ta
              CROSS APPLY dbo.fnSplitString(ta.Scenarios, ';') split
              INNER JOIN #table_scenarios AS ts ON split.splitdata = ts.ID
             )
    SELECT  units.ID,
            STUFF((
                   SELECT   ';' + CTE_Units.Unit
                   FROM     CTE_Units
                   WHERE    CTE_Units.ID = units.ID
                  FOR
                   XML PATH('')
                  ), 1, 1, '') + ';' AS Scenarios
    FROM    CTE_Units units
    GROUP BY units.ID;

結果:

結果輸出

在XML和CTE的幫助下:

DECLARE @xml xml

SELECT @xml = (
SELECT CAST('<i id="'+CAST(ID as nvarchar(max)) + '"><s>' + REPLACE(Scenarios,';','</s><s>') + '</s></i>' as xml)
FROM table_a
FOR XML PATH(''))

;WITH final AS (
SELECT  t.v.value('../@id','int') as Id,
        ts.Unit
FROM @xml.nodes('/i/s') as t(v)
INNER JOIN table_scenarios ts 
    ON ts.ID = t.v.value('.','nvarchar(10)')
)

SELECT DISTINCT id,
        (SELECT Unit +';'
        FROM final f1
        WHERE f.Id = f1.Id
        FOR XML PATH('')
        ) as Scenarios
FROM final f

輸出:

id  Scenarios
1   A;B;C;D;
2   C;D;

暫無
暫無

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

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