Сопоставление шаблонов T-SQL
-
23-08-2019 - |
Вопрос
Я пытаюсь найти способ запроса строк данных, используя столбец с разделителями «многозначный» канал в другой таблице в качестве предложения WHERE.SQL-СЕРВЕР 2005
Это мое лучшее описание проблемы:
Представьте себе столбец, разделенный вертикальной чертой, которому присвоена переменная типа @LIST = 'Bob|Mary|Joe'.
тогда я пытаюсь найти такое совпадение
Select * from Users where FirstName = 'Joe'
но расширен, чтобы быть
Select * from Users where FirstName "IS CONTAINED IN" @List
который вернет все записи Боба, Мэри и Джо.Спасибо за вашу помощь.
Решение
Вы можете использовать разделенный udf и присоединить его к основному запросу.видеть это связь для кода и примера.Ваш запрос в конечном итоге будет выглядеть так.Это непроверено, но, надеюсь, это укажет вам правильное направление.
Select A.* from Users A JOIN dbo.Fn_Split(@ValueArrayString, '|') B on A.FirstName = B.value
Другие советы
Как насчет
Select * from Users where CHARINDEX(FirstName + '|', @List + '|') > 0
Немного раздражает то, что вам приходится добавлять разделитель вертикальной черты к обеим строкам, но это работает и, вероятно, быстрее, чем функция.
Мне нравится решение MrTelly.Однако он обрабатывает только половину ложноположительных результатов.Полное решение выглядит следующим образом:
Select * from Users where CHARINDEX('|' + FirstName + '|', '|' + @List + '|') > 0
Трубу необходимо добавить с обоих концов.
Ознакомьтесь с функцией PATINDEX().Он немного ограничен, но он должен делать то, что вы ищете.
См. udf___Txt_SplitTab. от Эндрю Новика
Select * from Users where FirstName IN (Select Item From udf_Txt_SplitTAB (@LIST, '|'))