2016-08-01 4 views
0

В T-SQL, как мне заменить 2 подстроки?Переменные строки в TSQL

Мой столбец URL имеет:

https://www.host.com/test/last-first 

Как я могу изменить его:

https://www.host.com/test/first-last 

например:

https://www.host.com/test/smith-tim --> https://www.host.com/test/tim-smith 

Является ли это вообще возможно?

+0

Итак, вы хотите «заменить» свою строку? – HoneyBadger

+0

Да, это правильно –

+0

SQL на самом деле не построен для строковых манипуляций. Было бы намного проще (для вас) сделать это на вашем прикладном уровне, если это вообще возможно. Если нет, то просмотрите функции CHARINDEX, REPLACE и т. Д. - начиная с [документации] (https://msdn.microsoft.com/en-GB/library/ms181984.aspx). – TZHX

ответ

0

Я думал https://www.host.com/test строка такая же для всех записей.

Длина https://www.host.com/test является 27

DECLARE @Value NVARCHAR(MAX) = 'https://www.host.com/test/smith-tim' 

SELECT 
    SUBSTRING(@Value, 27, CHARINDEX('-', @Value, 27)) AS FullName, -- smith-tim 
    SUBSTRING(@Value, 27, CHARINDEX('-', @Value, 27) - 27) AS FirstName, -- smith 
    SUBSTRING(@Value, CHARINDEX('-', @Value, 27) + 1, 10000) AS LastName, -- tim 
    SUBSTRING(@Value, 0, 27) + 
     SUBSTRING(@Value, CHARINDEX('-', @Value, 27) + 1, 10000) + '-' + 
     SUBSTRING(@Value, 27, CHARINDEX('-', @Value, 27) - 27) AS Result -- https://www.host.com/test/tim-smith 
+1

Отлично! спасибо –

0

Это не имеет никаких ограничений длины и всегда пикапов последние символы ...

Это может быть оптимизирован, а также и использоваться в качестве скалярного UDF ..

declare @string varchar(max) 
set @string='https://www.host.com/test/last-first' 



;with 
cte 
as 
(select *,row_number() over (order by (select null)) as rownum,@string as string 
from 
[dbo].[SplitStrings_Numbers](@string,'/') 
) 
,cte1 
as 
(select string,b.item,rn,c.item as itemtobereplaced 
from cte c 
cross apply 
(
select * ,row_number() over (order by (select null)) as rn 
from [dbo].[SplitStrings_Numbers](c.item,'-') 
) b 
where rownum=5 
) 
select distinct 
replace(string,itemtobereplaced,finalstringtobreplaced) as finalstring 
from cte1 t1 
cross apply 
(select '-'+item from cte1 t2 where t1.string=t2.string order by rn desc for xml path('')) b(newvalue) 
cross apply 
(select stuff(b.newvalue,1,1,'')) a2(finalstringtobreplaced) 

Выход:

https://www.host.com/test/first-last 
Смежные вопросы