簡體   English   中英

如何將具有數組合並值的一列拆分為數組並加入其他表然后合並回來

[英]How to split one column with array merge value to array and join other table then merge back

有一個表 WaitCheckBil 像:

| BIL\_NO | USRS | DATE |
| --- | --- | --- |
| XC20090015 | ;STO09;STO02;STO04;STO06;STO10;STO07;STO10; | 2020\-09\-15 00:00:00.000 |
| XC20090016 | ;STO09;STO02;STO04;STO06;STO10;STO07;STO10; | 2020\-09\-15 00:00:00.000 |
| XC20090017 | ;STO09;STO02;STO04;STO06;STO10;STO07;STO10; | 2020\-09\-15 00:00:00.000 |
| XC20090018 | ;STO09;STO02;STO04;STO06;STO10;STO07;STO10; | 2020\-09\-16 00:00:00.000 |

和一個表用戶喜歡:

| USR | NAME |
| --- | --- |
| STO02 | John |
| STO04 | Eva |
| STO06 | Lisa |
| STO07 | Boke |
| STO09 | Nii |
| STO10 | Alisa |

預期結果 :

| BIL\_NO | USRS | DATE |
| --- | --- | --- |
| XC20090015 | ;Nii;John;Eva;Lisa;Alisa;Boke;Alisa; | 2020\-09\-15 00:00:00.000 |
| XC20090016 | ;Nii;John;Eva;Lisa;Alisa;Boke;Alisa; | 2020\-09\-15 00:00:00.000 |
| XC20090017 | ;Nii;John;Eva;Lisa;Alisa;Boke;Alisa; | 2020\-09\-15 00:00:00.000 |
| XC20090018 | ;Nii;John;Eva;Lisa;Alisa;Boke;Alisa; | 2020\-09\-16 00:00:00.000 |

我嘗試過的和認為的:

這是一個舊系統的表,所以我不能改變結構。
表邏輯是select * from WaitCheckBil where usrs like '%;' + @usr + ';%'; select * from WaitCheckBil where usrs like '%;' + @usr + ';%'; 獲取用戶的等待檢查 bil_NO。

我認為它可以分裂; usrs 列值到數組,然后與用戶列上的用戶表連接,然后合並回用戶列。

但是我在這里遇到了麻煩,我不知道如何在sql-server 2008上實現邏輯。

在線演示鏈接: SQL Server 2017 | 數據庫<>小提琴

您應該能夠一起使用 STRING_SPLIT 和 STRING_AGG 函數,如下所示(我已將其添加到您的小提琴中):

WITH uSplit AS (
SELECT [BIL_NO], [DATE], [USR], [NAME] FROM WaitCheckBil as wcb 
OUTER APPLY STRING_SPLIT(SUBSTRING(wcb.[USRS], 2, LEN(wcb.usrs) - 2), ';') AS S
LEFT JOIN Users AS U on U.[USR] = S.[value]
)
SELECT [BIL_NO], CONCAT(';', STRING_AGG([NAME], ';'), ';') AS [USRS], [DATE]
  FROM uSplit
 GROUP BY [BIL_NO], [DATE]

哎呀,對不起。 我看到你的小提琴是 SQL Server 2017 並認為沒問題。 您需要 SQL Server 2008 嗎? 我看到 STRING_SPLIT 和 STRING_AGG 直到 2016/2017 版本才到貨。 您可能需要編寫 UDF 才能在 SQL Server 2008 中獲得相同的結果。

好的,這是 SQL Server 2008 的 UDF:

CREATE FUNCTION ufnReplaceUIDs(@inUIDs varchar(100))
RETURNS varchar(100)
AS   
--  Replace User Ids with User Names
BEGIN  
    DECLARE @UID varchar(10);
    DECLARE @outUNames varchar(100);  
    DECLARE @outUName varchar(10);
    DECLARE @String varchar(100);
    SET @String = SUBSTRING(@inUIDs, 2, LEN(@inUIDs) - 1)  -- Remove First/Last ; 
    WHILE (CHARINDEX(';', @String) > 0)
        BEGIN
            SET @UID = LEFT(@String, CHARINDEX(';', @String) - 1);
            SELECT @OutUName = [NAME] FROM Users WHERE [USR] = @UID; 
            SET @OutUNames = CONCAT(@OutUNames, ';', @OutUName); 
            SET @String = SUBSTRING(@String, CHARINDEX(';', @String) + 1, 100);
        END;
    RETURN CONCAT(@outUNames, ';');  
END; 

像這樣使用它: SELECT [BIL_NO], dbo.ufnReplaceUIDs([USRS]) AS [USRS], [DATE] FROM WaitCheckBil ,結果是:

在此處輸入圖片說明

暫無
暫無

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

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