[MS SQL] Hoe splits je een kolom

Pagina: 1
Acties:
  • 1.068 views sinds 30-01-2008
  • Reageer

  • sidelo
  • Registratie: Juni 2005
  • Laatst online: 13-08 14:18
Ik moet in MS SQL een kolommen in meerdere laten splitsen

De table heeft 2 kolommen:
code:
1
2
3
4
5
6
7
ID           Message
1             Lastname: Janssen
               Firstname: Laurens
               Zipcode: 3088RR
2             Lastname: Test 
               Firstname: Test 
               Zipcode: Test

Als code probeerde ik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT ID,

MAX(CASE WHEN Message LIKE 'Lastname: %' THEN SUBSTRING(Message,13,50) ELSE 
'None' END),

MAX(CASE WHEN Message LIKE 'Firstname: %' THEN SUBSTRING(Message,12,50) ELSE 
'None' END),

MAX(CASE WHEN Message LIKE 'Zipcode: %' THEN SUBSTRING(Message,12,50) ELSE 
'None' END)

FROM Messages
GROUP BY ID

Met als resultaat:
code:
1
2
3
(ID) (No column name)                             (No column name)(No column name)
1     Janssen  Firstname: Laurens  Zipcode: 3088RR  None              None
2     Test  Firstname: Test  Zipcode: Test           None              None

Maar het resultaat wat ik graag wil hebben is:
code:
1
2
3
(ID)    (No column name)    (No column name)      (No column name)
1         Janssen             Laurens                3088RR
2            Test               Test                   test

Ik hoop dat iemand mij kan helpen of een betere oplossing weet?

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22-08 21:53
Wat doet die MAX daar? en die CASE? zoals ik het nu zie staan lastname, firstname en zipcode in 1 veld (met een "enter" erin?)? Als dat zo is dan zou ik degene die dit verzonnen heeft eerst eens de huid vol schelden...

Edit:
Als er een "enter" in staat zou ik het in stappen doen:
1. Splitten op "enter"
2. Alleen de tekst na de ": " selecteren

[ Voor 32% gewijzigd door sig69 op 01-07-2005 17:09 ]

Roomba E5 te koop


  • MrScratch
  • Registratie: December 2001
  • Laatst online: 20-08 14:42

MrScratch

I am rubber, you are glue

Ik snap al niets van de brontabel. Hoe zien die records er nou uit. Per record 2 velden met in de ene een id en de andere 1 regel? Of staat de hele meuk in 1 record, dus zowel Firstname als lastname?

Look behind you! A three headed monkey!


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL:
1
2
3
4
5
6
INSERT INTO NieuweTabel (ID, LastName, FirstName, Zipcode) 
SELECT ID,
       LTRIM(RTRIM(SUBSTRING(Message,PATINDEX('%Lastname:%',Message) + 10,PATINDEX('% Firstname:%',Message) - 11))) as LastName,
       LTRIM(RTRIM(SUBSTRING(Message,PATINDEX('% Firstname:%',Message) + 12, PATINDEX('% Zipcode:%',Message)-PATINDEX('% FirstName%',Message)-12))) as FirstName,  
       LTRIM(RTRIM(SUBSTRING(Message,PATINDEX('% Zipcode:%',Message) + 9,(LEN(Message) - (PATINDEX('% Zipcode:%',Message)-9))))) as ZipCode    
FROM RareTabel

Mooi is het niet, maar het werkt volgens mij wel. Het zal misschien best efficienter kunnen, maar volgens mij is dit slechts een eenmalige operatie.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • geenstijl
  • Registratie: Juli 2005
  • Niet online
Aangezien MsSQL geen Split-functie heeft, heb je aan onderstaande functie misschien wat.
Deze functie retourneert een tabel met de "gesplitte" gegevens.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- SELECT * FROM dbo.Split ( @teSplittenString, @SplitKarakter )

CREATE FUNCTION Split(@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (Items nvarchar(4000))
AS
    BEGIN
    DECLARE @INDEX INT
    DECLARE @SLICE nvarchar(4000)
    SELECT @INDEX = 1
    IF @String IS NULL RETURN
    WHILE @INDEX !=0

        BEGIN   
            SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
            IF @INDEX !=0
                SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
            ELSE
                SELECT @SLICE = @STRING
            INSERT INTO @Results(Items) VALUES(@SLICE)
            SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
            IF LEN(@STRING) = 0 BREAK
    END
    RETURN
END

  • AttiX
  • Registratie: Maart 2001
  • Laatst online: 23:43
Eerste normalisatie regel:

Meerwaardige of samengestelde meerwaardige attributen zijn NIET toegestaan.

  • BertS
  • Registratie: September 2004
  • Laatst online: 13-02 08:33
AttiX.SkategoaT schreef op vrijdag 01 juli 2005 @ 17:55:
Eerste normalisatie regel:

Meerwaardige of samengestelde meerwaardige attributen zijn NIET toegestaan.
Euhm, misschien is TS juist bezig om die regel te gaan toepassen in een door anderen ontwikkelde database? ;)
Pagina: 1