Verketten von Strings mit NULL

mille81

Benutzer
Beiträge
18
Hallo zusammen,

folgendes Problem:
Ich habe 3 Felder die zusammengesetzt einen Namen ergeben sollen.
Jetzt kann es sein das alle Felder gefüllt sind (z.B. Dr. Hans Müller) aber auch, dass der Titel fehlt (z.B. Peter Müller)

Ist der Titel gefüllt ist alles gut, steht im Titelfeld NULL kommt auch als ergebnis NULL raus.

Gibt es da eine Möglichkeit?
So wurde verkettet:
([titel] + ' ' + [vn] + ' ' + [nn]) AS name
 
Werbung:
Code:
isnull(replace([titel] + ' ', ' ', ''), '') + [vn] + ' ' + [nn]
Sowas in der Art?...

Das klappt!!! thx

Weitere Frage:
Code:
SELECT DISTINCT tbl_veranst.name, tbl_format.art, isnull(replace([titel] + ' ', '', ''), '') + [vn] + ' ' + [nn] AS pv,   tbl_veranst_ort.raum_bez, tbl_belegung.Datum, tbl_belegung.von, tbl_belegung.bis, tbl_veranst.id_veranst, tbl_belegung.B_ID
    FROM ((tbl_veranst_pv INNER JOIN tbl_persstamm ON tbl_veranst_pv.P_ID = tbl_persstamm.pid) INNER JOIN ((tbl_veranst INNER JOIN tbl_format ON tbl_veranst.ID_VA = tbl_format.ID_VA) INNER JOIN tbl_belegung ON tbl_veranst.ID_VE = tbl_belegung.ID_VE) ON tbl_veranst_pv.V_ID = tbl_veranst.ID_VE) INNER JOIN tbl_veranst_ort ON tbl_belegung.VO_ID = tbl_veranst_ort.VO_ID
    WHERE (((tbl_belegung.Datum)> GETDATE()) AND ((tbl_veranst.status)=1) AND ((tbl_veranst_ort.gebauede)='Ort'));

Das ist mein Code. Es kann sein, dass ich ein Ergebnis doppelt habe, weil tbl_veranst.name 2 namen (pv) enthält. Ich möchte jedoch nur den ersten angezeigt bekommen. In Access geht es mit der FIRST Funktion.
Wie löse ich das in MSSQL?
 
Dein replace() macht aber komische Sachen, ersetzt es nun '' mit '' ist es überflüssig. Ersetzt es ' ' durch '' wird es auch deinen vorher hinzugefügten Leerschritt hinter Titel killen, ganz zu schweigen von Leerschritten in einem Titel wie Professor Dr. X Y.

Ich empfehle dir Leerschritte mit ltrim() und/oder rtrim() zu bereinigen.

Zu deiner weiteren Frage:
Dein Code ist für mich absolut undurchschaubar.
 
Code:
SELECT tbl_veranst.name, First(tbl_persstamm.vn) AS ErsterWertvonvn
FROM (tbl_veranst_pv INNER JOIN tbl_persstamm ON tbl_veranst_pv.P_ID = tbl_persstamm.pid) INNER JOIN tbl_veranst ON tbl_veranst_pv.V_ID = tbl_veranst.ID_VE
GROUP BY tbl_veranst.name;

Zur Erklärung:
Ich habe eine tbl_veranst, dieser können 1 oder mehrere personen aus den tbl_persstamm zugeordnet sein. Ich möchte jedoch nur die zuerst gefunde Person ausgegeben bekommen. In Access geht das wie obenstehend, in MSSQL gibt es die First Funktion jedoch nicht.
 
Code:
SELECT tbl_veranst.name, First(tbl_persstamm.vn) AS ErsterWertvonvn
FROM (tbl_veranst_pv INNER JOIN tbl_persstamm ON tbl_veranst_pv.P_ID = tbl_persstamm.pid) INNER JOIN tbl_veranst ON tbl_veranst_pv.V_ID = tbl_veranst.ID_VE
GROUP BY tbl_veranst.name;

Zur Erklärung:
Ich habe eine tbl_veranst, dieser können 1 oder mehrere personen aus den tbl_persstamm zugeordnet sein. Ich möchte jedoch nur die zuerst gefunde Person ausgegeben bekommen. In Access geht das wie obenstehend, in MSSQL gibt es die First Funktion jedoch nicht.

Zählen via row_number() passend partitioniert und sortiert und nur die mit row_number = 1 ausgeben.
 
Beispiel:
Code:
SELECT    vorname
FROM    (

SELECT    ROW_NUMBER() OVER (PARTITION BY vorname ORDER BY name) AS zeile,
        vorname
FROM    personen

        ) t
WHERE    zeile = 1
 
Das versteh ich jetzt nicht... was soll das "t" da?
Das t ist nur der Tabellen Alias für den Select in der Klammer. Du kannst die ROW_NUMBER() leider nicht im selben Select "erzeugen" und eingrenzen (z.B. mit HAVING oder so), das geht erst in einem weiteren Select.
Wie bau ich meien Abfrage da jetzt genau ein?
Das könnte ich dir nur sagen wenn ich dein JOIN-Konstrukt verstehen würde...
 
Dann versuch ich das nochmal zu erklären:
Code:
SELECT tbl_veranst.name, First(tbl_persstamm.vn) AS ErsterWertvonvn
FROM (tbl_veranst_pv INNER JOIN tbl_persstamm ON tbl_veranst_pv.P_ID = tbl_persstamm.pid) INNER JOIN tbl_veranst ON tbl_veranst_pv.V_ID = tbl_veranst.ID_VE
GROUP BY tbl_veranst.name;

tbl_veranst = Veranstaltungsdaten wie name
tbl_persstamm = Personendaten für die Personen die einer Veranstaltung zugeordnet werden können
tbl_veranst_pv = Zuordnungstabelle für Personen zu einer Veranstaltung (speichert die ID der Person (P_ID) mit der ID der Veranstaltung (V_ID bzw. ID_VE))
 
Code:
SELECT    tbl_veranst.name,
        tbl_persstamm_modified.vn AS ErsterWertvonvn
FROM    tbl_veranst_pv
INNER JOIN (    SELECT    ROW_NUMBER() OVER (PARTITION BY tbl_persstamm.pid ORDER BY tbl_persstamm.vn) AS zeile,
                        tbl_persstamm.pid,
                        tbl_persstamm.vn
                FROM    tbl_persstamm ) tbl_persstamm_modified
ON        tbl_veranst_pv.P_ID = tbl_persstamm_modified.pid
AND        tbl_persstamm_modified.zeile = 1
INNER JOIN tbl_veranst
ON        tbl_veranst_pv.V_ID = tbl_veranst.ID_VE
 
Hm okay das funktioniert, ich bekomms aber nicht in meine eigentiche Abfrage wie oben gepostet hin...

Wenn ich jetzt also noch eine weitere Tabelle dazunehmen will:
tbl_format.art (dort steht die Art der Veranstaltung), die id der art steht wiederum in der tbl_veranst
In meiner Abfrage so gelöst:
Code:
INNER JOIN ((tbl_veranst INNER JOIN tbl_format ON tbl_veranst.ID_VA = tbl_format.ID_VA)
 
Zuletzt bearbeitet:
Also ich bin schon etwas weiter gekommen...
Code:
SELECT DISTINCT  tbl_veranst.name,
        tbl_veranst.ID_VE,
        tbl_veranst.id_veranst,
        tbl_format.art,
        tbl_veranst_ort.raum_bez,

        isnull(replace(tbl_persstamm.titel + ' ', '', ''), '') + [tbl_persstamm].[vn] + ' ' + [tbl_persstamm].[nn] AS pv
FROM    tbl_veranst
INNER JOIN (    SELECT    ROW_NUMBER() OVER (PARTITION BY tbl_belegung.Datum ORDER BY tbl_belegung.Datum) AS zeile,
                        tbl_belegung.ID_VE,
                        tbl_belegung.Datum,
                        tbl_belegung.von, tbl_belegung.bis, tbl_belegung.B_ID, tbl_belegung.VO_ID
                FROM    tbl_belegung )
         tbl_belegung
ON        tbl_veranst.ID_VE = tbl_belegung.ID_VE
AND        tbl_belegung.zeile = 1

INNER JOIN tbl_format
ON tbl_veranst.ID_VA = tbl_format.ID_VA

INNER JOIN tbl_veranst_ort
ON tbl_belegung.VO_ID = tbl_veranst_ort.VO_ID

INNER JOIN (tbl_persstamm INNER JOIN tbl_veranst_pv ON tbl_persstamm.pid = tbl_veranst_pv.P_ID) ON tbl_veranst.ID_VE = tbl_veranst_pv.V_ID


WHERE(((tbl_veranst.name)='Personalarbeit')) AND ((tbl_veranst_ort.gebauede)='Campus');

Raus kommt:
Code:
name    ID_VE    id_veranst    art    raum_bez    pv
Personalarbeit    -1903116602    20151poM10    Vortrag    Campus    Dr. Meier
Personalarbeit    -1903116602    20151poM10    Vortrag    Campus    Dr. Friedrich

Das ist schon fast korrekt, es fehlen aber die ganzen Spalten der tbl_belegung.
Wie kriege ich die da jetzt noch rein, ohne dass er da wieder 4 Zeilen drauss macht?
 
Werbung:
Zurück
Oben