2010-11-27 29 views
2

Ich habe Tabellenkategorien (c) und eine weitere Tabelle (x) mit einer Spalte, die mit Komma getrennte Cathans als Varchar-Datentyp enthalten kann. Ich möchte verwandte Kategorien auswählen, aber ich habe den Fehler "Konvertierung fehlgeschlagen beim Konvertieren des Varchar-Wertes '5,' in Datentyp int." wenn sie versuchen, wählen:Konvertierung fehlgeschlagen beim Konvertieren des Varchar-Werts '1' in den Datentyp int

SELECT ID, Title FROM c WHERE ID IN (SELECT catIDs FROM x WHERE ID=any); 

Die Unterabfrage gibt Daten wie „1,3,4“

+1

Was passiert, wenn Sie WHERE ID IN durch WHERE CAST (ID als varchar (5)) IN ersetzen? – CarneyCode

+0

Ich stimme @Traroth - Liste der IDs zurückgegeben als eine Zeichenfolge von durch Komma getrennten Werten ** ein Problem mit Datenbank-Design **. Gibt es wirklich die Spalte 'catIDs' in der' x' Tabelle? Oder vielleicht ist dies nur ein Beispiel und "1,3,4" wird tatsächlich von gespeicherten Daten zurückgegeben oder aus einer unstrukturierten Datei abgerufen? –

+0

@Carnotaurus: Es funktioniert, aber nicht das richtige Ergebnis zurückgeben, weil es nach 'x, y', nicht 'x', 'y' –

Antwort

4

Sie müssen die von der Unterabfrage zurückgegebene Zeichenfolge 1,3,4 in separate int-Werte aufteilen. SQL Server verfügt nicht über eine integrierte Funktion, aber Sie können this user-defined function verwenden.

Erstellen Sie die Funktion dbo.Split in Ihrer Datenbank und dann Abfrage neu schreiben, wie folgt:

SELECT ID, Title 
FROM c 
WHERE ID IN 
    (
    SELECT s 
    FROM dbo.Split(',', '1,3,4') 
) 

ich die Unterabfrage mit Beispiel ersetzt führt 1,3,4 die Abfrage zu verkürzen und es leichter verständlich zu machen.

+0

Ja, ich werde http://stackoverflow.com/questions/314824/t-sql-opposite-to-string-concatenation-how-to-split-string-into-multiple-recor/314917#314917 verwenden Funktion. Vielen Dank. –

1

Wenn ich es richtig, Sie haben tatsächlich Werte wie „1,3,4“ in der Spalte CATIDs . Sie sollten also eine Teilzeichenfolge in der Auswahl Ihrer Unterabfrage extrahieren.

Übrigens, ich bin kein MS SQL Server-Experte, aber es ist wahrscheinlich eine schlechte Datenbank-Design, dies zu tun. Ich bin nicht sicher, ob die RDBMS-Engine in einem solchen Fall Indizes verwendet ...

Verwandte Themen