【发布时间】:2017-04-25 19:13:49
【问题描述】:
表 1 中有几个字符串,我想根据表 2 中的可用值对其进行更新。
示例代码
http://rextester.com/HQFOQ18215
IF OBJECT_ID('Test1','U') iS NOT NULL
DROP TABLE Test1;
IF OBJECT_ID('Test2','U') iS NOT NULL
DROP TABLE Test2;
Create table Test1
(
Id INT
,Lid INT
,MyString VARCHAR(MAX)
,Did INT
,Secid INT
);
INSERT INTO Test1 values (1,100,'you,shall,not,pass,gandlaf,the,grey', 401, 501);
INSERT INTO Test1 values (2,100,'ok,fine,bye', 401, 501);
INSERT INTO Test1 values (3,100,'test,dev,uat,prod', 403, 501);
INSERT INTO Test1 values (4,100,'1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16', 404, 501);
Create table Test2
(
Id INT IDENTITY(1,1)
,SecId INT
,CommaPosition INT
,Value VARCHAR(50)
,Did INT
,RowId INT
);
INSERT INTO Test2 Values (501, 4, '[Quantity]', 401, 1);
INSERT INTO Test2 Values (501, 14, '[Price]', 401, 1);
INSERT INTO Test2 Values (501, 4, '[Quantity]', 401, 2);
INSERT INTO Test2 Values (501, 14, '[Price]', 401, 2);
INSERT INTO Test2 Values (501, 14, '[Quantity|Price]', 403, 3);
INSERT INTO Test2 Values (501, 4, '[Interest]', 404, 4);
INSERT INTO Test2 Values (501, 14, '[Expired]', 404, 4);
SELECT * FROM Test1;
SELECT * FROM Test2;
预期输出
/*
Expected OUTPUT
Id Lid MyString Did Secid
1 100 you,shall,not,[quantity],gandlaf,the,grey,,,,,,,[Price], 401 501
2 100 ok,fine,bye,[quantity],,,,,,,,,,[Price], 402 501
3 100 test,dev,uat,prod,,,,,,,,,,[Quantity|Price], 403 501
4 100 1,2,3,[Quantity],5,6,7,8,9,10,11,12,13,[Price],15,16 404 501
*/
第一个字符串
you,shall,not,pass,gandlaf,the,grey其中"pass"在第 4 个逗号位置之前,它被 table2 中的[quantity]替换,但这没有第 14 个逗号 所以逗号被复制,直到它到达第 14 个逗号并且在第 14 个逗号[Price]被替换之前。最终输出为"you,shall,not,[quantity],gandlaf,the,grey,,,,,,,[Price],"第二个字符串
ok,fine,bye没有第 4 个逗号或第 14 个逗号,因此添加第 4 个逗号,在此之前替换[quantity],然后添加逗号直到第 14 个位置 基于 Table2 中的逗号位置列,最终字符串变为ok,fine,bye,[quantity],,,,,,,,,,[Price],第三字符串
test,dev,uat,prod在表2中只有第14个逗号位置可用,所以逗号复制到第14个逗号和第14个逗号之前[Quantity|Price]字符串 添加最终字符串变为test,dev,uat,prod,,,,,,,,,,[Quantity|Price],在第 4 个字符串
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16中,如果您看到第 4 个和第 14 个逗号可用,则第 14 个逗号之前的字符串替换为[Interest]并且字符串第 14 个逗号替换为[Expired]保持剩余字符串不变。
我想达到上面的输出,我试过下面的更新语句没有给我想要的结果。
UPDATE T1
SET T1.MyString = T1.MyString + REPLICATE(',',T2.CommaPosition - (len(T1.MyString) - LEN(REPLACE(T1.MyString,',',''))))
FROM Test1 as T1 INNER JOIN Test2 as T2 ON T1.Secid = T2.SecId AND T1.Did = T2.Did AND T1.Id = T2.RowId;
SELECT DISTINCT T1.Lid, T1.MyString, T1.Did, T1.Secid, T2.RowId
FROM Test1 as T1 INNER JOIN Test2 as T2 ON T1.Secid = T2.SecId AND T1.Did = T2.Did AND T1.Id = T2.RowId;
【问题讨论】:
-
这根本没有任何意义。为什么你首先有这些奇怪的分隔字符串?这违反了 1NF 并破坏了关系数据的全部意义。
标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2