如何在SQL Server中用一个单词替换列中的重复单词
我的数据库中有几百万个与文件路径相关的字符串; 由于第三方程序,这些路径已嵌套如下:如何在SQL Server中用一个单词替换列中的重复单词,sql,sql-server,Sql,Sql Server,我的数据库中有几百万个与文件路径相关的字符串; 由于第三方程序,这些路径已嵌套如下: C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\ 我想更新条目,使thirdparty\thirdparty\etc变成\thirdparty 我尝试过以下代码: UPDATE table SET Field = REPLACE(Field, 'tables\thirdpart
C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\
我想更新条目,使thirdparty\thirdparty\etc
变成\thirdparty
我尝试过以下代码:
UPDATE table
SET Field = REPLACE(Field, 'tables\thirdparty\%thirdparty\%\', 'tables\thirdparty\')
你想要这样的东西吗
SELECT SUBSTRING('tables\thirdparty\%thirdparty\%\',0,CHARINDEX('\','tables\thirdparty\%thirdparty\%\',0)) + '\thirdparty\'
或
可以使用以下技术避免使用循环:
Update TABLE
SET Field = left(Field,charindex('*',replace(Field, 'thirdparty\', '*'))-1)+'thirdparty\'+right(Field,charindex('*',reverse(replace(Field, 'thirdparty\', '*')))-1)
现在已经太晚了,但我只是想,如果我想把一个单词替换成他想重复的同一个单词。这将用追加一次“\thirdparty”替换所有 看看这个
Declare @table table(Field varchar(max))
insert into @table values('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\1')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\2')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\3')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\4')
UPDATE @table
SET Field = SUBSTRING (Field, 1, CHARINDEX('\thirdparty', Field ) ) + 'thirdparty\'
--replace (Field , 'thirdparty\' ,'')
+ reverse( SUBSTRING ( REVERSE(Field), 1, CHARINDEX(reverse('\thirdparty'), REVERSE(Field) )-2 ) )
--REPLACE(Field, 'tables\thirdparty\%thirdparty\%\', 'tables\thirdparty\')
select * from @table
您可以发布您的试用代码吗?您可以向我们展示一些代码,让我们看看您的试用情况吗?您是想连续更换2个第三方还是任意数量的代码?您的目标是什么?您想更新现有字符串还是只处理SELECT查询?@TimBiegeleisen any numberDoes replace真的支持通配符吗?@a_horse_with_no_name-是的,它支持通配符。@Dansmith-我可以知道更新时出现了什么错误吗?嗯,顺便说一句,它应该可以工作。因为我已经在我当地的酒店试过了。使用您提供的字符串。@eftpotrm-我们不能没有while循环吗?@rajeshpanchal循环通常可以被基于集合的操作替换,但代价是更复杂的查询。如果循环将有大量的迭代,那么值得重写为基于集合的循环,以提高性能;在这种情况下,可能的迭代次数不足,性能会变得很糟糕,因此我会选择更简单、更易于编写和维护的代码。我想我会再次弹出并说声谢谢@eftpotrm您的代码再次拯救了我的培根。@eftpotrm您知道吗,这种情况再次发生,再次感谢。是的,这可能是解决方案,我也给出了同样的解决方案。位已更改,但几乎相同。是的,您的更新是可以的,但在“选择”中使用的通配符是错误的。我也试过了,见上图。
Update TABLE
SET Field = left(Field,charindex('*',replace(Field, 'thirdparty\', '*'))-1)+'thirdparty\'+right(Field,charindex('*',reverse(replace(Field, 'thirdparty\', '*')))-1)
Declare @table table(Field varchar(max))
insert into @table values('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\1')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\2')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\3')
,('C:\files\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\thirdparty\unique_bit_here\4')
UPDATE @table
SET Field = SUBSTRING (Field, 1, CHARINDEX('\thirdparty', Field ) ) + 'thirdparty\'
--replace (Field , 'thirdparty\' ,'')
+ reverse( SUBSTRING ( REVERSE(Field), 1, CHARINDEX(reverse('\thirdparty'), REVERSE(Field) )-2 ) )
--REPLACE(Field, 'tables\thirdparty\%thirdparty\%\', 'tables\thirdparty\')
select * from @table