2010-01-11 7 views
0

Quelle est la meilleure façon de extracting the values from vvv.www.xxx.yyy.zzzExtraction de caractères dans SQL SERVER 2005?

Notez que vvv ou www ou xxx ou yyy ou zzz peuvent varier à-dire qu'il peut être de toute longueur.

Pour cette raison, je ne peux pas utiliser substring with charindex. Je ne veux pas faire cela avec LOOP ou CURSEUR

En utilisant CTE et un tableau de nombres, cela peut aussi être fait, mais ce sera un programme un peu long.

Un simple programme 1 ligne est là pour accomplir le même.

La sortie souhaitée sera

Col1 Col2 Col3 Col4 Col5 

vvv www xxx yyy zzz 

Il est notre mission

Merci

+0

La meilleure solution est de ne pas stocker les données de cette façon. Si chaque bloc signifie quelque chose de différent et que vous voulez pouvoir utiliser ces blocs de données, stockez-les dans des champs séparés. – HLGEM

Répondre

0

Vous pouvez utiliser SUBSTRING avec CHARINDEX, il faut juste un peu plus de travail:

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 

Vous pourriez nettoyer i t avec une jointure comme ceci:

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

Les deux requêtes ont échoué dans ce cas ensemble @s = 'vv55v.w6666ww.xx7777x.yy88888y.z99999zz' Msg 537, niveau 16, état 2, ligne 3 Paramètre de longueur non valide passé à la fonction GAUCHE ou SUBSTRING. –

+0

Il suffit de déclarer @s comme un plus grand varchar, il est tronqué. Je suppose que vous choisiriez dans une table de toute façon, c'est juste un exemple de code. – RedFilter