2010-01-11 50 views
0

什么是extracting the values from vvv.www.xxx.yyy.zzz提取SQL SERVER 2005中的字符?

注意,VVV或www或XXX YYY或ZZZ或最好的方式可以变化即,它可以是任何长度的。因此,我不能使用substring with charindex

我不想用LOOP或CURSOR做到这一点。通过使用CTE和一个数字表也可以完成,但这将是一个有点冗长的程序。

任何简单的1行程序都可以完成相同的任务。

所需的输出将是

Col1 Col2 Col3 Col4 Col5 

vvv www xxx yyy zzz 

这是我们的任务

感谢

+0

最好的办法是不要保存数据的方式。如果每个块意味着不同的东西,并且希望能够使用这些数据块,则将它们存储在单独的字段中。 – HLGEM

回答

0

可以使用SUBSTRING与CHARINDEX,它只是需要更多一点的工作:

declare @s as varchar(25) 
set @s = 'vvv.www.xxx.yyy.zzz' 
select 
left(@s, charindex('.', @s) - 1) as col1, 
substring(@s, charindex('.', @s) + 1, charindex('.', @s, charindex('.', @s) + 1) - charindex('.', @s) - 1) as col2, 
substring(@s, charindex('.', @s, charindex('.', @s) + 1) + 1, charindex('.', @s, charindex('.', @s, charindex('.', @s) + 1) + 1) - charindex('.', @s, charindex('.', @s) + 1) - 1) as col3, 
substring(@s, charindex('.', @s, charindex('.', @s, charindex('.', @s) + 1) + 1) + 1, charindex('.', @s, charindex('.', @s, charindex('.', @s, charindex('.', @s) + 1) + 1) + 1) - charindex('.', @s, charindex('.', @s, charindex('.', @s) + 1) + 1) - 1) as col4, 
right(@s, len(@s) - charindex('.', @s, charindex('.', @s, charindex('.', @s, charindex('.', @s) + 1) + 1) + 1)) as col5 

你可以清洁我牛逼了一个参加这样的:

declare @s as varchar(25) 
set @s = 'vvv.www.xxx.yyy.zzz' 
select left(@s, first - 1) as col1, 
    substring(@s, first + 1, second - first - 1) as col2, 
    substring(@s, second + 1, third - second - 1) as col3, 
    substring(@s, third + 1, fourth - third - 1) as col4, 
    right(@s, len(@s) - fourth) 
from (select @s s) a 
inner join 
(
    select charindex('.', @s) as first, 
    charindex('.', @s, charindex('.', @s) + 1) as second, 
    charindex('.', @s, charindex('.', @s, charindex('.', @s) + 1) + 1) as third, 
    charindex('.', @s, charindex('.', @s, charindex('.', @s, charindex('.', @s) + 1) + 1) + 1) as fourth 
) b on 1=1 

+0

在这种情况下,两个查询都失败set @s ='vv55v.w6666ww.xx7777x.yy88888y.z99999zz' Msg 537,Level 16,State 2,Line 3 传递给LEFT或SUBSTRING函数的长度参数无效。 –

+0

只需将@s声明为更大的varchar,它就会被截断。我假设你会从表中选择,这只是示例代码。 – RedFilter