Avatar billede lllund Nybegynder
17. februar 2010 - 14:09 Der 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

ID,Navn(90), SplitNavn1(30), SplitNavn2(30), SplitNavn3(30)

nogle der har nogle gode forslag?
Avatar billede arne_v Ekspert
17. februar 2010 - 15:02 #1
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
?
Avatar billede lllund Nybegynder
17. februar 2010 - 16:22 #2
Hej

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.

Håber det giver mere mening :)
Avatar billede lllund Nybegynder
18. februar 2010 - 08:02 #3
Hej Igen

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

Nogen der vil give et forslag på ovenstående :) ?
Avatar billede Syska Mester
18. februar 2010 - 11:37 #4
Jeg har kun lytet med, og forstår reelt set ik' problemet.

For at jeg skal kunne bidrage med noget, bliver du nødt til at komme med noget mere data ... dvs hvordan det ser ud i dag ....

f.eks. table data som den er nu og hvordan det skal se ud.

[ID], Navn, Alder
10, Søren, 23
30, Kenneth, 27

mvh
Avatar billede lllund Nybegynder
18. februar 2010 - 12:09 #5
Hej

Den tabel jeg har til at starte med indeholder

[FirmaID], [FirmaNavn]
00001,Tuj Holding ApS  Under Tvangsopløsning
00002,Mediastruct V/ Danijel Stefanac
00003,Centervej 7 I/S V/ René Ubbesen Magne Jakobsen Og Henrik Offersen

etc

Den tabel jeg skal ende ud med skal så være :

[FirmaID],[FirmaNavnSplit1],[FirmaNavnSplit2],[FirmaNavnSplit3]
00001,Tuj Holding ApS  Under, Tvangsopløsning
00002,Mediastruct V/ Danijel, Stefanac
00003,Centervej 7 I/S V/ René,Ubbesen Magne Jakobsen Og,Henrik Offersen


Altså de 3 nye navne felter er således kun 30 char lange og skal fyldes op således navnene ikke "skæres over"

det er vel noget med at søge efter charindex(' ',FirmaNavn) og på den måde finde mellemrum og dele op?

giver det mere mening?
Avatar billede janus_007 Nybegynder
18. februar 2010 - 18:50 #6
Altså det er jo ikke så svært, men helt ærligt... inden svaret kommer.. hvad katten er det da for en opdeling, hvad kan det bruges til?
Avatar billede lllund Nybegynder
18. februar 2010 - 21:01 #7
Hej Janus

"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.
Avatar billede Syska Mester
19. februar 2010 - 00:21 #8
pseudo code må vel være ...

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.

mvh
Avatar billede Syska Mester
19. februar 2010 - 00:22 #9
Lyder som en one time operation ... så vælg det sprog dine færdigheder er bedst i ...

mvh
Avatar billede janus_007 Nybegynder
19. februar 2010 - 02:04 #10
Prøv denne her:


  declare @s varchar(100) = 'Tuj Holding ApS Under Tvangsopløsning + nogle flere ulovligheder'
  declare @index int = 30
  declare @string varchar(100)
  declare @pIndex int = 0
 
 
  while @index < LEN(@s) + 30
  begin
     
      while @index > @pIndex
      begin
     
        if substring(@s, @index, 1) = ' '
            begin
                print substring(@s, @pIndex,  @index - @pIndex)
                set @pIndex = @index
            end
           
        set @index = @index -1
       
      end
      set @index = @index + 30
     
  end
Avatar billede lllund Nybegynder
19. februar 2010 - 08:16 #11
Hej

Jeg takker jeg arbejder viddere med ovenstående. smid endeligt et svar :)
Avatar billede janus_007 Nybegynder
19. februar 2010 - 13:03 #12
Godt så :)
Avatar billede Syska Mester
19. februar 2010 - 16:38 #13
Lignede meget min psuedo kode ... og godt du kom videre. Der er intet mere træls end at sidde fast ... :-)

mvh
Avatar billede lllund Nybegynder
22. februar 2010 - 11:55 #14
Når nu endte jeg ud med følgende :

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

Det var hvad jeg endte ud med. :)
Avatar billede lllund Nybegynder
22. februar 2010 - 12:30 #15
ja og så lige en ændring :)

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 :)
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