17. februar 2010 - 14:09Der er
14 kommentarer og 1 løsning
Opdeling af navn
Hej
Jeg har en tabel "navnesplit" med id,navn varchar(90) jeg skal have splittet op
1. regel navnet skal deles der hvor der er ' ' (mellemrum) hvis muligt 2. regel navnet skal ende ud med at være i max 3 kolonner der hver er max 30 char, så vidt muligt skal navnene deles ved der hvor der er mellemrum
således skal jeg have ovenstående sat ind i følgende tabel
Hvorfor kan du ikke bruge de to mest oplagte muligheder: 1) aendre tabel strukturen til at have d ekolonner du skal bruge 2) lave opslitning i applikationen fremfor i SQL ?
jeg har nok ikke forklaret mig tydeligt, det er mulighed 1 jeg vælger.
Problemet opstår når jeg skal have sat data ind i de nye kolonner, altås selve opdelingen af det samlede navn jeg har i det omprindelige navnefelt.
Jeg skal ikke have kappet navne over men have dem delt der hvor der er mellemrum i navnet. således at det bliver delt "pænt" op i de 3 nye kolonner.
Der må ikke være delt f.eks sådan at det sidste i SplitNavn1 er (Blikk) og det første i SplitNavn2 er (enslager) i dette tilfølle skal jeg så have Blikkenslager rykket frem i SplitNavn2.
Det der egentligt var min plan var noget i stil med
use test go update p set p.SplitNavn1 = xxxxxxxxxxx1, set p.SplitNavn2 = xxxxxxxxxxx2, set p.SplitNavn3 = xxxxxxxxxxx3, from navnesplit p where SplitNavn1 is null
"ikke så svært" er vel relativt set i forhold til ens færdigheder ;)
Det det kan bruges til er såmend bare at jeg skal have data ind i nogle felter der ikke er mere end 30 chars lange og navnene ikke skal skæres over andre steder end hvor der er mellemrum.
1. Hent et navn ... 2. Find length ... hvis under 30 chars stop. 3. Find sidste mellemrum som er under 30 chars henne 4. tag en substring af det(0 til x) 5. Tag resten af navnet ... substring(x og frem) gentag fra step 2.
insert i den nye table.
Men som janus siger, så virker det meget mærkeligt, men der kan selvf være mange grunde til at du skal ud i den her løsning.
go alter table working_navnesplit1 add navn1 varchar(30), navn2 varchar(30), navn3 varchar(30), temp1 varchar(255), temp2 varchar(255) go --------------------- update a set temp1 = rtrim(juridisk_navn) from working_navnesplit1 a go --Navn1 laves --Step1 update a set navn1 = temp1 ,temp1 = null from working_navnesplit1 a where temp1 is not null and len(temp1) < 31 go --Step2 update a set navn1 = left(temp1,CHARINDEX(' ',temp1)) ,temp1 = right(temp1, len(temp1) - CHARINDEX(' ',temp1)) from working_navnesplit1 a where navn1 is null and CHARINDEX(' ',temp1) between 1 and 30 go --Step3 declare @i as int set @i = 2 while @i > 0 begin update a set navn1 = navn1 + rtrim(left(temp1,CHARINDEX(' ',temp1))) ,temp1 = right(temp1, len(temp1) - CHARINDEX(' ',temp1)) from working_navnesplit1 a where len(navn1) + CHARINDEX(' ',temp1,2) between 1 and 30 and CHARINDEX(' ',temp1,2) > 0 set @i = @@rowcount end --Navn2 laves --Step1 update a set navn2 = temp1 ,temp1 = null from working_navnesplit1 a where temp1 is not null and len(temp1) < 31 go --Step2 update a set navn2 = left(temp1,CHARINDEX(' ',temp1)) ,temp1 = right(temp1, len(temp1) - CHARINDEX(' ',temp1)) from working_navnesplit1 a where navn2 is null and CHARINDEX(' ',temp1) between 1 and 30 --Step3 declare @i as int set @i = 2 while @i > 0 begin update a set navn2 = navn2 + left(temp1,CHARINDEX(' ',temp1)) ,temp1 = right(temp1, len(temp1) - CHARINDEX(' ',temp1)) from working_navnesplit1 a where len(navn2) + CHARINDEX(' ',temp1,2) between 1 and 30 and CHARINDEX(' ',temp1,2) > 0 set @i = @@rowcount end --Navn3 (resternede) update a set navn3 = left(temp1,30) from working_navnesplit1 a where temp1 is not null
Kan se jeg fik fjernet nogle mellemrum i ovenstående, så de 2 gennemløb er lavet til følgende:
--Step3 declare @i as int set @i = 2 while @i > 0 begin update a set navn1 = rtrim(navn1) + ' '+ rtrim(left(temp1,CHARINDEX(' ',temp1))) ,temp1 = right(temp1, len(temp1) - CHARINDEX(' ',temp1)) from working_navnesplit1 a where len(navn1) + CHARINDEX(' ',temp1,2) between 2 and 29 and CHARINDEX(' ',temp1,2) > 0 set @i = @@rowcount end
bare hvis nu nogle var nysgerrige :)
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.