[英]SQL append in middle of column data in update query
进行数据刷新时,我们需要在\\\\prod01\\\\Test\\Load
服务器名称后附加\\\\prod01.qa.com\\\\Test\\Load
我该如何编写更新查询。 我可能需要做的服务器名称可能不同,就是编写更新脚本以将服务器名称附加到qa.com。
这是我的查询,提供了所有具有服务器位置的结果。
select * from AppSetting where Value like '%\\\\%\\%' or Value like '%//%/%';
我的Prod数据如下所示
Value
\\prod01\Images\Load
\\prod01prod6253\Images\Load
\\server05ser\Images\Delete
\\pgdg1076\Email
\\pgdg1076ythg\Test\Load
http://prod7/delta/
更新查询后,我的质量检查数据应如下所示
Value
\\prod01.qa.com\Images\Load
\\prod01prod6253.qa.com\Images\Load
\\server05ser.qa.com\Images\Delete
\\pgdg1076.qa.com\Email
\\pgdg1076ythg.qa.com\Test\Load
http://prod7.qa.com/delta/
这是我的更新查询。 我可以写一个通用查询吗
UPDATE eroom.AppSetting
SET Location = REPLACE(Location, '\\prod01\', '\\prod01.qa.tbc.com\')
WHERE Location like '%\\prod01\%';
UPDATE eroom.AppSetting
SET Location = REPLACE(Location, '\\server05ser\', '\\server05ser.qa.tbc.com\')
WHERE Location like '%\\server05ser\%';
我将其发布为新答案,因为OP大量移动了目标帖子。 相反,我现在使用CHARINDEX
查找每个斜杠的位置(正向或反向)。 幸运的是,注入需要在第三个斜杠之前进行,因此我们可以利用它来取得优势:
SELECT STUFF(V.Value,CI3.I,0,'.qa.tbc.com') AS NewValue,*
FROM (VALUES('\\prod01\Images\Load'),
('\\prod01prod6253\Images\Load'),
('\\server05ser\Images\Delete'),
('\\pgdg1076\Email'),
('\\pgdg1076ythg\Test\Load'),
('http://prod7/delta/'))V([value])
CROSS APPLY (VALUES(CASE WHEN V.[value] LIKE '%/%' THEN '/' ELSE '\' END)) L(C) --So I don't have to keep checking what character I need
CROSS APPLY (VALUES(CHARINDEX(L.C,V.[value]))) CI1(I)
CROSS APPLY (VALUES(CHARINDEX(L.C,V.[value],CI1.I+1))) CI2(I)
CROSS APPLY (VALUES(CHARINDEX(L.C,V.[value],CI2.I+1))) CI3(I);
这是一种方法。 我将PATINDEX
和CHARINDEX
的表达式放在FROM
,因为我发现它更容易阅读,并且意味着更少的重复:
SELECT V.[value],
ISNULL(STUFF(V.Value,ISNULL(CI.fs,CI.bs),0,'.qa.tbc.com'),V.[value]) AS NewValue
FROM (VALUES('\\prod01\Images\Load'),
('\\prod05\Images\Delete'),
('\\prod10\Email'),
('//http://prod7/delta/'))V([value])
CROSS APPLY (VALUES(NULLIF(PATINDEX('%prod[0-9]%',V.value),0)))PI(I)
CROSS APPLY (VALUES(NULLIF(CHARINDEX('/',V.[value],PI.I),0),NULLIF(CHARINDEX('\',V.[value],PI.I),0))) CI(fs,bs);
这回答了问题的原始版本。
最简单的方法可能是使用stuff()
和一个case
表达式:
select (case when location like '\\prod[0-9][0-9]\*'
then stuff(location, 9, 0, '.qa.tbc.com'
else location
end)
“ prod”部分看起来是固定长度,因此您无需搜索模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.