Avatar billede bosteen Nybegynder
26. januar 2004 - 13:09 Der 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
Avatar billede trer Nybegynder
26. januar 2004 - 13:25 #1
Hmm.. spøjs udfordring. Er det noget der skal performe eller må det gerne være tungt? Med andre ord - skal querien køres tit eller sjældent?
Avatar billede trer Nybegynder
26. januar 2004 - 13:35 #2
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

go


bruges således:

select dbo.extractletters('086xs'), dbo.extractnumber('086xs')
Avatar billede trer Nybegynder
26. januar 2004 - 13:52 #3
hov - ovenstående skulle have været et svar :-)
Avatar billede bosteen Nybegynder
26. januar 2004 - 14:54 #4
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

Giver fx. følgende resultat:

4154-038X  |  4154  |  038X  |  X  |  0   

Hvad nu ??
Avatar billede trer Nybegynder
26. januar 2004 - 15:35 #5
Æh - Ét ciffer? 

Tester jeg med

select dbo.extractnumber('086')

får jeg resultatet

86

Hvis du har behov for foranstillede nuller skal ExtractNumber blot laves om til at returnere en varchar fremfor en int.
Avatar billede trer Nybegynder
28. januar 2004 - 12:26 #6
hvad sker?
Avatar billede bosteen Nybegynder
28. januar 2004 - 12:44 #7
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
Avatar billede trer Nybegynder
28. januar 2004 - 14:21 #8
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
Avatar billede bosteen Nybegynder
28. januar 2004 - 15:02 #9
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 :-)
Avatar billede bosteen Nybegynder
28. januar 2004 - 15:05 #10
Der er vist et eller andet galt m. accepter funktionen i øjeblikket - jeg sørger for, du får dine point senere i dag eller i morgen
Avatar billede trer Nybegynder
28. januar 2004 - 17:43 #11
Fint :-)

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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester