26. januar 2004 - 13:09Der er
10 kommentarer og 1 løsning
Sorter text fra tal i kombineret streng
Hvordan kan jeg dele en kolonne med tal & bogstaver op i to kolonner, hvor den ene indeholder teksten og den anden indeholder tallene? Eksempel: Kolonne A indeholder "086.XS Det skal give to kolloner, hvor: Kolonne B indeholder tallet "86" Kolonnce C indeholder teksten "XS" Værdierne i kolonne A ligger i Textformat og kunne se ud som følgende: "088X" "088" "XL" eller "086.XS" Da jeg arbejder i T-SQL må svaret meget gerne være skrevet i dette sprog
Hvis performance ikke er det store problem er der en nem løsning her:
create function ExtractNumber(@s varchar(8)) returns int as begin declare @a int, @b char, @c varchar(4) set @a = 1 set @c = '' while @a<=len(@s) begin set @b = substring(@s,@a,1) if isnumeric(@b)=1 set @c=@c+@b set @a=@a+1 end return cast(@c as int) end go
create function ExtractLetters(@s varchar(8)) returns varchar(4) as begin declare @a int, @b char, @c varchar(4) set @a = 1 set @c = '' while @a<=len(@s) begin set @b = substring(@s,@a,1) if isnumeric(@b)=0 set @c=@c+@b set @a=@a+1 end return @c end
Kolonnen der skal indeholde den numeriske værdi, henter kun EET ciffer :(
Jeg bruger den således: SELECT Co.Article, Pr.product, CASE CHARINDEX('-',Co.Article) WHEN 0 THEN NULL ELSE RIGHT(Co.Article, LEN(Co.Article)-CHARINDEX('-',Co.Article)) END as Storrelse,
CASE CHARINDEX('-',Co.Article) WHEN 0 THEN NULL ELSE dbo.extractLetters(RIGHT(Co.Article, 1)) END as StorrelseTekst,
CASE CHARINDEX('-',Co.Article) WHEN 0 THEN NULL ELSE dbo.extractNumber(RIGHT(Co.Article, 1)) END as StorrelseTal
Undskyld svartiden - jeg får en fejlmeddelelse som hedder "Syntax error converting the varchar value '088.' to a column of data type int" Tilsynelandende får den ikke fjernet punktummet? Hvis jeg så går ind og ændrer til Varchar for at få værdien 088. så giver den kun eet ciffer som resultat?
Her hvordan jeg ændrede til varcher(ændringer skrevet m. STORT): alter function ExtractNumber(@s varchar(8)) returns VARCHAR as begin declare @a int, @b char, @c varchar(4) set @a = 1 set @c = '' while @a<=len(@s) begin set @b = substring(@s,@a,1) if isnumeric(@b)=1 set @c=@c+@b set @a=@a+1 end return cast(@c as VARCHAR) end
Ok, så giver det mening. Problemet er, at et . indgår i numeriske udtryk, nemlig i komma-tal - og at du kun får et tegn retur skyldes, at du ikke har lavet en længdeangivelse på din varchar.
Funktionen nedenfor skulle være den korrekte
create function ExtractNumber(@s varchar(8)) returns varchar(4) as begin declare @a int, @b char, @c varchar(4) set @a = 1 set @c = '' while @a<=len(@s) begin set @b = substring(@s,@a,1) if (isnumeric(@b)=1) and (@b<>'.') set @c=@c+@b set @a=@a+1 end return @c end
Yes, det virker - og den sorterer ovenikøbet punktummet fra, så det er åbenbart kun som en "mellemregning" at punktummet forstyrrer int Jeg siger mange tak :-)
Bemærk at jeg faktisk ændrede if isnummeric() linjen så den frasorterer punktumer - jeg havde ikke været opmærksom på, at der kunne være den type tegn i dine data.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.