# [MS SQL] Spalteninhalt splitten



## fUnKuCh3n (6. Februar 2014)

Hallo,

ich habe ein Statement was mir Daten aus der DB holt, siehe folgender Code:

```
select 
displayname,
mail
from adobjects
where type = '1'
and mail <> ''
order by displayname
```

Das Ergebniss ist wie folgt:

Mustermann, Maxmax.mustermann@musterdomain.de

Ich benötige die Daten allerdings in Vor- und Nachname aufgeteilte Spalten.
Quasi:

MustermannMaxmax.mustermann@musterdomain.de

Im Netz konnte ich da nun noch keine so funktionelle Idee dazu finden wie ich das am leichtesten umsetze.

Hat da jemand eine Idee oder Anregung wie das klappen könnte?


----------



## Yaslaw (6. Februar 2014)

Solange der displaynamesauber mit Komma getrennt ist.
Leider fand ich bei meiner schnellen Suche kein Regex für MS SQL. Darum habe ich mit der Onlinedoku zu MS SQL den folgenden Code zusammengeschustert.
Mein Test bei SQL Fiddle

```
SELECT
  IIF(
    -- Überprüfen ob ein Komma vorhanden ist. Wenn nicht, ist t.displayname der Nachname
    CHARINDEX(',', t.displayname) = 0,
    t.displayname,
    RTRIM(
      SUBSTRING(
        t.displayname, 
        1, 
        CHARINDEX(',', t.displayname)-1
      )
     )
  ) AS nachname,

  IIF(
    CHARINDEX(',', t.displayname) = 0,
    '',
    LTRIM(
      SUBSTRING(
        t.displayname, 
        CHARINDEX(',', t.displayname) + 1, 
        LEN(t.displayname)
      )
    )
  ) AS vorname
FROM
  adobjects t
```


----------



## fUnKuCh3n (6. Februar 2014)

Führe ich das Statement im SQL Management Center aus bekomme ich folgende Rückmeldung:


```
Meldung 102, Ebene 15, Status 1, Zeile 4
Falsche Syntax in der Nähe von '='.
```

Wo hingegen es bei SQL Fiddle einwandfrei funktioniert. 
Es ist nen SQL 2008 R2.

Nachtrag: wenn ichs bei SQL Fiddle auf 2008 ab änder kommt auch eine Fehlermeldung...


----------



## Yaslaw (6. Februar 2014)

Da gibts wohl Versionsunterschiede.
Vergleich mal die Befehle, ob diese alle bei MSSQL2008 vorhnaden sind.

Das müsste ich jetzt auch machen, da ich bis heute Morgen noch nie mit irgend einer Version von  MSSQL gerbeitet habe....

Wenn wir wissen, welchen Befehl es in der 2008er nicht gibt, können wir alternativen suchen.


----------



## fUnKuCh3n (6. Februar 2014)

Habe folgendes gefunden:
http://stackoverflow.com/a/11541146

IIF wurde erst mit 2012 eingeführt.


----------



## fUnKuCh3n (6. Februar 2014)

Habs nun umgebaut:


```
SELECT
	CASE
		CHARINDEX(',', t.displayname) 
		WHEN '0' 
		THEN t.displayname 
		ELSE RTRIM(SUBSTRING(t.displayname,1,CHARINDEX(',', t.displayname)-1))
	END  as 'Nachname' ,

	CASE
		CHARINDEX(',', t.displayname) 
		WHEN '0'
		THEN ''
		ELSE
		LTRIM(SUBSTRING(t.displayname,CHARINDEX(',', t.displayname) + 1,LEN(t.displayname)))
		END AS Vorname,
		mail
	FROM
		adobjects t
		where mail <> ''
```


----------

