2009-02-13 64 views
0

我想通过在另一个表中使用“多值”管道分隔列作为WHERE子句来查找数据行的查询方法。 SQL SERVER 2005T-SQL模式匹配

这是我最好的问题描述:

试想一个管道分隔栏设置为像@LIST =变量'鲍勃|玛丽|乔

然后我试图找到这样

Select * from Users where FirstName = 'Joe' 

但匹配延伸到是

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

将返回所有Bob,Mary和Joe条目。谢谢你的帮助。

+0

好运。 SQL用于查询规范化数据,而不是管道分隔的字符串。 – yfeldblum 2009-02-13 01:20:44

+0

嘿,不是我的设计。 ;> – 2009-02-13 01:50:52

回答

1

您可以使用拆分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 

有点讨厌,你必须追加管道分隔符都是字符串,但它的工作原理,以及它可能更快比功能。

1

我喜欢MrTelly的解决方案。但是,它只处理一半的误报。 的完整的解决方案如下:

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

管道需要在这两种添加结束