Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gibt Zeilen zurück, in denen die ID in einer durch Semikolons getrennten Zeichenfolge aus der MSSQL-Unterabfrage steht

Dies ist ein weiteres Beispiel dafür, wie wichtig es ist, Ihre Daten zu normalisieren.
Mehrere Datenpunkte in einer einzigen Spalte zu halten, ist fast nie das richtige Design, und mit fast nie meine ich etwa 99,9999 %.

Wenn Sie Ihre Datenbank nicht normalisieren können, können Sie eine Problemumgehung wie folgt verwenden:

SELECT * 
FROM Projects p
WHERE EXISTS (
    SELECT Project_ID 
    FROM Feedback F WHERE ID = 268 
    AND Project_ID IS NOT NULL
    AND ';'+ F.Project_ID +';' LIKE '%;'+ CAST(p.Project_ID as varchar) +';%'
)

Sie können den IN nicht verwenden -Operator, da er eine Liste von Werten erwartet, die durch ein Komma getrennt sind, während Sie versuchen, ihm einen einzelnen Wert bereitzustellen, der durch ein Semikolon getrennt ist. Selbst wenn die Werte in Project_ID durch ein Komma getrennt wären, würde es immer noch nicht funktionieren.

Der Grund, warum ich den ; hinzugefügt habe auf jeder Seite der Project_ID in beiden tabellen steht auf diese weise das LIKE Der Operator gibt true zurück für jeden Standort findet es die Projects.Project_Id innerhalb der Feedback.Project_Id . Sie müssen den ; hinzufügen zu Projects.Project_Id um das LIKE zu verhindern um true zurückzugeben wenn Sie nach einer Zahl suchen, die teilweise mit den Zahlen in der Zeichenfolge mit Trennzeichen übereinstimmt. Betrachten Sie die Suche nach 12 in einer Zeichenfolge, die 1;112;455 enthält – ohne das Trennzeichen zum Suchwert hinzuzufügen (in diesem Beispiel 12), das LIKE Operator würde true zurückgeben .