2009-02-13 7 views
0

J'essaie de trouver un moyen d'interroger des lignes de données en utilisant une colonne délimitée par un canal «multivaleur» dans une autre table en tant que clause WHERE. SQL Server 2005Correspondance de modèle T-SQL

Voici 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 retournerait toutes les entrées Bob, Mary et Joe. Merci de votre aide.

+0

Bonne chance. SQL est conçu pour interroger des données normalisées, et non des chaînes délimitées par des tuyaux. – yfeldblum

+0

Hé, pas mon design. ;> –

Répondre

1

Vous pouvez utiliser un fichier udf partagé et le joindre à votre requête principale. Voir ce link pour le code et un exemple. Votre requête finirait par ressembler à ceci. Ceci n'est pas testé mais j'espère que cela vous indique la bonne direction.

Select A.* from Users A JOIN dbo.Fn_Split(@ValueArrayString, '|') B on A.FirstName = B.value 
0

Vérifiez la fonction PATINDEX(). C'est un peu limité, mais ça devrait faire ce que vous cherchez.

2

Que diriez-vous

Select * from Users where CHARINDEX(FirstName + '|', @List + '|') > 0 

Un peu ennuyeux que vous devez ajouter le séparateur de tuyau pour les deux chaînes, mais il fonctionne, et il est probablement plus rapide qu'une fonction.

+0

Mais est-ce sécurisé? – James

+0

C'est assez joli. +1! (Cependant, je me demande pourquoi il ne peut pas être juste charindex (Prénom, @ Liste)? – Learning

+0

Cela pourrait donner des fausses correspondances, à savoir si un nom dans la liste était BillyBob, il ne correspondrait pas correctement sans le délimiteur supplémentaire. – MrTelly

1

J'aime la solution de MrTelly. Cependant, il ne s'occupe que 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