簡體   English   中英

SQL Server 2008-用另一個表中的值替換列中的文本值

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

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