Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Restituisce le righe in cui l'ID è una stringa separata da punto e virgola dalla sottoquery MSSQL

Questo è un altro esempio dell'importanza di normalizzare i dati.
Mantenere più punti dati in una singola colonna non è quasi mai la progettazione corretta e con quasi mai intendo circa il 99,9999%.

Se non riesci a normalizzare il tuo database, puoi utilizzare una soluzione alternativa come questa:

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) +';%'
)

Non puoi usare il IN operatore poiché si aspetta un elenco di valori delimitato da una virgola, mentre si tenta di fornirgli un unico valore delimitato da un punto e virgola. Anche se i valori in Project_ID fossero delimitati da una virgola, non funzionerebbe comunque.

Il motivo per cui ho aggiunto il ; su ciascun lato del Project_ID in entrambe le tabelle è così che il LIKE l'operatore restituirà true per qualsiasi posizione trova il Projects.Project_Id all'interno del Feedback.Project_Id . Devi aggiungere il ; al Projects.Project_Id per evitare il LIKE per restituire true quando stai cercando un numero che corrisponda parzialmente ai numeri nella stringa delimitata. Considera di cercare 12 in una stringa contenente 1;112;455 - senza aggiungere il delimitatore al valore di ricerca (12 in questo esempio) il LIKE l'operatore restituirà true .