[英]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.