2017-10-11 37 views
2

鑑於弦數爲SQL字符串連接到表

SET @Codes1 = 3,4 
SET @Codes2 = 1 
SET @Codes3 = --empty 

表 - TblCode

Id Code 
1  A 
2  B 
3  C 
4  D 

如何將@Codes1, @Codes2, @Codes3與連接表中TblCode所以它返回以下輸出轉換:

1. @Codes1 = CD 
2. @Codes2 = A 
3. @Codes3 = --empty 

請注意,輸出的連接沒有逗號。

PS - 這是一個更大更復雜的數據集的小例子。請忽略任何錯誤的設計模式。

+4

不要以逗號分隔的字符串存儲代碼。你的代碼會簡單得多。 –

+0

@GordonLinoff,我完全理解。過去多年來一直如此。無法幫助它。我不確定你是否記得,但你之前回答過類似的問題 - https://stackoverflow.com/questions/44415270/sql-string-combine-based-on-id – Sajal

+0

。 。這個問題是不同的(它對數據格式有相同的反應)。它不是試圖替換原地。你應該真的修復你的數據格式。 –

回答

3

你可以試試這個。我爲@ Codes1添加了答案,但它也適用於@ Codes2和@ Codes3。

DECLARE @TblCode TABLE (Id INT, Code VARCHAR(2)) 
INSERT INTO @TblCode 
VALUES(1, 'A'), 
(2,'B'), 
(3,'C'), 
(4,'D') 

DECLARE @Codes1 VARCHAR(10) = '3,4' 
DECLARE @Codes2 VARCHAR(10) = '1' 
DECLARE @Codes3 VARCHAR(10) = NULL 

DECLARE @CodesOut VARCHAR(10) = '' 


;WITH CTE_1 AS (
    SELECT CODE= @Codes1 + ',' 
) 
, CTE_2 AS -- It silit text to rows 
(
    SELECT RIGHT(CTE_1.CODE, LEN(CTE_1.CODE) - CHARINDEX(',',CTE_1.CODE)) CODE , SUBSTRING(CTE_1.CODE, 0, CHARINDEX(',',CTE_1.CODE)) ID, CHARINDEX(',',CTE_1.CODE) AS CI 
    FROM CTE_1 
    UNION ALL 
    SELECT RIGHT(CTE_2.CODE, LEN(CTE_2.CODE) - CHARINDEX(',',CTE_2.CODE)) CODE , SUBSTRING(CTE_2.CODE, 0, CHARINDEX(',',CTE_2.CODE)) ID, CHARINDEX(',',CTE_2.CODE) AS CI 
    FROM CTE_2 WHERE LEN(CTE_2.CODE) > 0 
) 
SELECT @CodesOut = @CodesOut + C.Code FROM CTE_2 INNER JOIN @TblCode C ON CTE_2.ID = C.Id 

SELECT @CodesOut 

結果:

CD 
+0

這按預期工作。謝謝:) – Sajal

+0

不客氣! –

1

您可以使用遞歸CTE。這裏有一個方法:

with c as (
     select c.*, row_number() over (partition by id) as seqnum 
     from c 
    ), 
    cte as (
     select cast(@codes as varchar(max)) as str, 
      replace(@codes, id, code) as newstr, 
      1 as lev 
     from c 
     where seqnum = 1 
     union all 
     select str, replace(newstr, id, code), lev + 1 
     from cte join 
      c 
      on c.seqnum = cte.lev + 1 
    ) 
select top (1) newstr 
from cte 
order by lev desc; 

如果在語法錯誤,建立一個SQL小提琴或Rextester或相似的,所以它可以是固定的東西。

+0

感謝您的幫助:) – Sajal