2010-02-26 2 views
0

J'ai une chaîne dans une table SQL Server dont le format est comme ça ...Comment extraire des valeurs numériques à partir d'une chaîne dans SQL Server

nvarchar int nvarchar int nvarchar 

Il n'y a pas d'autres délimiteurs évidentes que certains caractères sont numériques et les autres sont alpha.

Comment est-ce que je référence la deuxième valeur int?

+3

pourquoi avez-vous plusieurs valeurs stockées dans une colonne? –

+1

Pourquoi avez-vous plusieurs valeurs stockées dans une colonne * sans délimiteur * !? Cela ne va pas beaucoup plus mal que ça dans les terrains DB ... – Aaronaught

+0

Je me demandais juste s'il y avait un moyen de faire une vue de table avec plusieurs colonnes de la colonne d'une table à l'origine? – Drejc

Répondre

0

Personnellement, j'écrire une fonction CLR et utiliser la chaîne fonction SPLIT. Voici un code que je crois fonctionne:

Declare @Result Table 
(
    stringval varchar(100), 
    numvalue decimal(18,4) 
) 

Declare @Test varchar(100) 
Declare @index int 
Declare @char char(1) 
Declare @currentVal varchar(100) 
Declare @prevVal varchar(100) 
Declare @currentType char(1) 
Declare @nextType char(1) 

Set @index = 0 
Set @Test = 'a100.4bb110ccc2000' 

Set @currentVal = '' 
Set @currentType = 's' 

While @index <= LEN(@Test) 
Begin 
    Set @index = @index + 1 
    Set @char = SUBSTRING(@Test,@index,1)  

    Set @nextType = CASE WHEN PATINDEX('[^0-9.]', @char) > 0 then 's' else 'n' end 

    If @currentType <> @nextType 
    begin 
     if @currentType = 'n' 
      insert into @Result(stringval,numvalue) values(@prevVal,@currentVal) 
     Set @prevVal = @currentVal 
     set @currentVal = '' 
     set @currentType = @nextType 
    end 

    SEt @currentVal = @currentVal + @char 


ENd 

Select * FROM @Result 
+0

Merci Ben - cela a parfaitement fonctionné la première fois – cymorg

2

Une façon est d'utiliser la fonction patindex:

declare @s varchar(100) 
declare @i1 int 
declare @s2 varchar(100) 
declare @i2 int 
declare @s3 varchar(100) 
declare @i3 int 
declare @s4 varchar(100) 
declare @i4 int 
declare @secondInt int 

set @s = 'alpha123beta3140gamma789' 

set @i1 = PATINDEX('%[0-9]%', @s) 
set @s2 = SUBSTRING(@s, @i1, 100) 
set @i2 = PATINDEX('%[^0-9]%', @s2) 
set @s3 = SUBSTRING(@s2, @i2, 100) 
set @i3 = PATINDEX('%[0-9]%', @s3) 
set @s4 = SUBSTRING(@s3, @i3, 100) 
set @i4 = PATINDEX('%[^0-9]%', @s4) 

set @secondInt = CAST(SUBSTRING(@s4, 1, @i4-1) as int) 

select @s, @secondInt 
+0

Merci DyingCactus mais cela n'a pas fonctionné pour toutes les valeurs possibles – cymorg

+0

Ok, curieux, quelle était l'une des valeurs de chaîne où cela n'a pas fonctionné? – DyingCactus

Questions connexes