Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Renvoie les lignes où l'ID est dans une chaîne séparée par des points-virgules de la sous-requête MSSQL

Ceci est encore un autre exemple de l'importance de normaliser vos données.
Conserver plusieurs points de données dans une seule colonne n'est presque jamais la bonne conception, et par presque jamais, je veux dire environ 99,9999 %.

Si vous ne pouvez pas normaliser votre base de données, vous pouvez utiliser une solution de contournement comme celle-ci :

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

Vous ne pouvez pas utiliser le IN puisqu'il attend une liste de valeurs délimitées par une virgule, alors que vous essayez de lui fournir une valeur unique délimitée par un point-virgule. Même si les valeurs de Project_ID étaient délimitées par une virgule, cela ne fonctionnerait toujours pas.

La raison pour laquelle j'ai ajouté le ; de chaque côté du Project_ID dans les deux tables est que de cette façon le LIKE l'opérateur renverra true pour n'importe quel emplacement, il trouve le Projects.Project_Id dans le Feedback.Project_Id . Vous devez ajouter le ; au Projects.Project_Id pour empêcher le LIKE pour retourner true lorsque vous recherchez un nombre correspondant partiellement aux nombres de la chaîne délimitée. Pensez à rechercher 12 dans une chaîne contenant 1;112;455 - sans ajouter le délimiteur à la valeur de recherche (12 dans cet exemple) le LIKE l'opérateur renverrait true .