[MSSQL] Verbindung zweier Tabellen mit verschiedenen Datentypen

Fragenfrager

Erfahrenes Mitglied
Hallo liebes Forum,

ich habe zwei Tabellen mit leider vorgegebenem Aufbau:
1) Tabelle Benutzer:
Benutzername (string, unique) | OeSelection(string)
In der Spalte OeSelection steht zB folgender Eintrag: "2~4~260~8~16~9"
In der Spalte Benutzername steht zB folgender Eintrag: "Fragenfrager"


2) Tabelle Oe:
OeBezeichnung (String;Primary Key; unique) | OeNr(Integer)
In der Spalte OeBezeichnung steht zB folgender Eintrag: "Gruppe1"
In der Spalte OeNr steht zB folgender Eintrag: "4"


In Benutzer.OeSelection stehen somit die Werte aus Oe.OeNr, unschönerweise durch "~" getrennt.

Ich benötige eine Abfrage, die mir zu jedem Benutzer.Benutzernamen alle zugeordneten Oe.OeBezeichnung erstellt.

Ich versuchte nun schon etwas in der Art:
SQL:
select 
	Benutzer.Benutzername,
                Oe.OeNr,
	Oe.Bezeichnung

	from oe
	
	left outer join 
	Benutzer
	on 
	(cast(oe.OeNr as TEXT) IN b.OeSelection)

Dabei habe ich zwei Probleme:
1) Ich kann Oe.OeNr nicht in Text umwandeln: Fehler: "Die explizite Konvertierung des int-Datentyps in text ist nicht zulässig."
Ohne Umwandlung läßt er einen Vergelcih zwischen Text und Int auch nicht zu

2) Die Verwendung der "~"-Zeichen in Benutzer.OeSelection stellt mich vor ein Problem:
Frage ich mit "IN" ab, so wirft er mir auch Benutzer für die OeNr = 20 aus, wenn ich nach OeNr =2 suche.
 
Zuletzt bearbeitet von einem Moderator:
Davon abgesehen, dass das Tabellen- bzw DB-Design alles andere als optimal ist, kommst Du so an das gewünschte Ergebnis:
SQL:
SELECT 
    b.Benutzername,
    oe.OeNr,
    oe.Bezeichnung
 
    FROM oe
    
    LEFT OUTER JOIN 
    Benutzer b
    ON FIND_IN_SET(oe.OeNr, REPLACE(b.OeSelection,'~', ','))

oe.OeNr muss nicht expliziet gecastet werden, da MySql dies automatisch macht.

Wenn Du unbedingt CASTen willst, dann eher so:
Code:
 CAST(oe.OeNr AS Char)
:D

*örgs* sehe grad: ist ja nicht MySql sondern M$SQL... vllt. gibt es ja ne ähnliche Function FIND_IN_SET...
 
Zuletzt bearbeitet:
Hallo,

mit MSSQL könnte folgendes funktionieren:
SQL:
SELECT 
    Benutzer.Benutzername,
    Oe.OeNr,
    Oe.Bezeichnung
FROM Oe
LEFT OUTER JOIN Benutzer b
    ON PATINDEX('~'+CAST(Oe.OeNr AS VARCHAR)+'~', '~'+b.OeSelection+'~')

Grüße,
Matthias
 
Vielen Dank, das hat mich auf den richtigen Weg gebracht.
Mein Statement lautet nun
SQL:
select 
oe.Bezeichnung,
b.BenutzerName 
from oe
inner join Benutzer b on  (CHARINDEX ('~' + cast(oe.OeNr as varchar) + '~','~' + cast(b.OeSelection as varchar),1) >0 or b.OeSelection is null) and b.Gruppe = 0
order by oe.Bezeichnung
Das b.Gruppe hatte ich nicht erwähnt, war für das Problem auch nicht relevant.
 
Zurück