T-SQL Correspondance de modèle
-
23-08-2019 - |
Question
Je suis en train de trouver un moyen d'interroger des lignes de données à l'aide d'un « multivaleur » colonne délimité par des tuyaux dans une autre table comme une clause WHERE. SQL Server 2005
Ceci est ma meilleure description du problème:
Imaginez un tuyau colonne délimité réglé à une variable comme @LIST = 'Bob | Mary | Joe'
alors je suis en train de trouver un match comme celui-ci
Select * from Users where FirstName = 'Joe'
mais étendue à être
Select * from Users where FirstName "IS CONTAINED IN" @List
qui renverrait toutes les entrées Bob, Mary et Joe. Merci pour votre aide.
La solution
Vous pouvez utiliser un udf split et le joindre à votre requête principale. voir cette pour le code et un exemple. Votre requête finirait par ressembler à cela. Ce n'est pas testé mais nous espérons que cela vous fait dans la bonne direction.
Select A.* from Users A JOIN dbo.Fn_Split(@ValueArrayString, '|') B on A.FirstName = B.value
Autres conseils
Qu'en est-
Select * from Users where CHARINDEX(FirstName + '|', @List + '|') > 0
Un peu ennuyeux que vous devez ajouter le tuyau à delimiter les deux chaînes, mais il fonctionne, et il est probablement plus rapide qu'une fonction.
J'aime la solution de MrTelly. Cependant, il est seulement en prenant soin de la moitié des faux positifs. La solution complète est la suivante:
Select * from Users where CHARINDEX('|' + FirstName + '|', '|' + @List + '|') > 0
Le tuyau doit être ajouté aux deux extrémités
Consultez la fonction PATINDEX (). Il est un peu limité, mais il devrait faire ce que vous cherchez.
Voir udf ___ Txt_SplitTab de Andrew Novick
Select * from Users where FirstName IN (Select Item From udf_Txt_SplitTAB (@LIST, '|'))