2009-02-13 4 views
0

Я пытаюсь найти способ запроса строк данных с помощью столбца с разделителями столбцов «многозначный» в другой таблице в качестве предложения WHERE. SQL SERVER 2005Соответствие шаблону T-SQL

Это мое лучшее описание проблемы:

Представьте себе трубу разделителями набор столбцов переменной как @list = 'Bob | Mary | Джо

я пытаюсь найти матч, как этот

Select * from Users where FirstName = 'Joe' 

но доопределенная

Select * from Users where FirstName "IS CONTAINED IN" @List 

, который возвратит все записи Боба, Мэри и Джо. Спасибо за вашу помощь.

+0

Удачи. SQL предназначен для запросов к нормализованным данным, а не к строкам, разделенным по строкам. – yfeldblum

+0

Эй, не мой дизайн. ;> –

ответ

1

Вы можете использовать split udf и присоединиться к нему по основному запросу. см. этот код link для кода и примера. Ваш запрос будет выглядеть следующим образом. Это непроверено, но, надеюсь, это указывает на то, что вы в правильном направлении.

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

Проверьте функцию PATINDEX(). Он немного ограничен, но он должен делать то, что вы ищете.

2

Как насчет

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

Немного раздражает, что вы должны добавить разделитель труб в обеих строках, но это работает, и это, вероятно, быстрее, чем функция.

+0

Но безопасно ли это? – James

+0

Это довольно аккуратно. +1! (Тем не менее, мне интересно, почему это не может быть просто charindex (FirstName, @ List)? – Learning

+0

Это может дать ложные совпадения, т. Е. Если имя в списке было BillyBob, оно будет неправильно соответствовать без дополнительного разделителя. – MrTelly

1

Мне нравится решение MrTelly. Тем не менее, он заботится только о половине ложных срабатываний. Полное решение выглядит следующим образом:

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

Труба должна быть добавлена ​​на обоих концах