[英]SQL Server 2008 - Replace Text Values in Column with Values from Another Table
我試圖將我的Google-fu徒勞無功,所以我在這里! 不幸的是,由於這些表來自我必須報告的應用程序,因此我無法對其進行任何更改。
在SQL Server 2008中,我試圖用另一個表(表2)中的值替換一個文本字符串列(表1)中的多個值。
提前致謝!!
表格1
id value
-------------
1 a1, a2, a3
2 a2, a3
3 a4
表2
id value
---------
a1 Value1
a2 Value2
a3 Value3
a4 Value4
期望的輸出
id value
-----------------------------
1 Value1, Value2, Value3
2 Value2, Value3
3 Value4
該站點具有分隔的文本拆分功能http://www.sqlservercentral.com/articles/Tally+Table/72993/
使用該函數將您的值拆分到臨時表中。 用新值替換臨時表中的值。 然后使用STUFF..FOR XML
將記錄重新組合在一起並更新您的表。
將函數添加到數據庫后,帶有幾個cte的一個查詢應該能夠處理所有這些情況。
使用Sql Fiddle的示例
按照@ user1221684的建議,使用http://www.sqlservercentral.com/articles/Tally+Table/72993/上的DelimitedSplit8K,您可能會想到這樣的東西。 像這樣處理定界數據是很痛苦的。 首先,您必須解析該字符串,以便可以將其連接到另一個表,然后通過將其填充回非規范化形式來破壞它。
請確保如果您使用此功能,您應該了解該功能以及此代碼的功能。 這不是入門級的t-sql,它將在生產中斷時(凌晨3點)支持您,而不是我。
if OBJECT_ID('tempdb..#table1') is not null
drop table #table1;
create table #table1
(
id int,
value varchar(50)
);
insert #table1
select 1, 'a1, a2, a3' union all
select 2, 'a2, a3' union all
select 3, 'a4';
if OBJECT_ID('tempdb..#table2') is not null
drop table #table2;
create table #table2
(
id varchar(50),
value varchar(50)
);
insert #table2
select 'a1', 'Value1' union all
select 'a2', 'Value2' union all
select 'a3', 'Value3' union all
select 'a4', 'Value4';
with parsedValues as
(
select t1.id
, t1.value
, LTRIM(x.item) as item
from #table1 t1
cross apply dbo.DelimitedSplit8K(t1.value, ',') x
)
, swappedVals as
(
select pv.id
, t2.value
from parsedValues pv
join #table2 t2 on t2.id = pv.item
)
select id
, STUFF((select ',' + value
from swappedVals sv2
where sv2.id = sv.id
order by sv2.value --need to make sure to order here so the results are in the right order
for XML path('')), 1, 1, '') as MyValues
from swappedVals sv
group by id
;
對於此解決方案,我很抱歉:)它可以滿足您的需求:
create table TableA(
id int,
string varchar(255)
)
create table table2(
id varchar , text varchar(255)
)
insert into tableA values(1,'a,b,c,d')
insert into tableA values(2,'e,f')
insert into table2 values('a', 'value1')
insert into table2 values('b', 'value2')
insert into table2 values('c', 'value3')
insert into table2 values('d', 'value4')
insert into table2 values('e', 'value5')
insert into table2 values('f', 'value6')
select id, left(myConcat,len(myConcat)-1) from (
select c.id, replace(replace(CAST(CAST('<i'+stuff((select * from(
SELECT A.[id] ,
Split.a.value('.', 'VARCHAR(1000)') AS String
FROM (SELECT [id],
CAST ('<M>' + REPLACE([string], ',', '</M><M>') + '</M>' AS XML) AS String
FROM TableA) AS A CROSS APPLY String.nodes ('/M') AS Split(a)) a
inner join table2 b on a.String = b.id
where a.id = c.id
FOR XML PATH ('')
),1,2,'') AS XML).query('/text') AS VARCHAR(1000)),'<text>',''),'</text>',',') myConcat
from TableA c
group by c.id
) d
用這個:
DECLARE @t TABLE(id int,value varchar(255))
INSERT INTO @t (id,value)
VALUES(1,'a1'),(2,'a2'),(3,'a3')....
SELECT *,STUFF((SELECT DISTINCT ','+value FROM @t WHERE id=t.id)
FOR XML PATH('')),1,2,' ')
FROM (SELECT DISTINCT ID FROM @t) t
如果ID相同,則DISTINCT
,否則放開
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.