Сопоставление с образцом T-SQL - PullRequest
0 голосов
/ 13 февраля 2009

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

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

Представьте себе столбец с разделителями трубы, установленный в переменную типа @LIST = 'Bob | Mary | Joe'

тогда я пытаюсь найти соответствие как это

Select * from Users where FirstName = 'Joe'

но расширено до

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

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

Ответы [ 5 ]

2 голосов
/ 13 февраля 2009

Как насчет

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

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

1 голос
/ 26 октября 2010

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

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

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

1 голос
/ 13 февраля 2009

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

Select A.* from Users A JOIN dbo.Fn_Split(@ValueArrayString, '|') B on A.FirstName = B.value 
0 голосов
/ 13 февраля 2009

См. Udf ___ Txt_SplitTab от Эндрю Новика

Select * from Users where FirstName IN (Select Item From udf_Txt_SplitTAB (@LIST, '|'))
0 голосов
/ 13 февраля 2009

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

...