Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL模式匹配_Sql_Tsql_Pattern Matching_Sql Like - Fatal编程技术网

T-SQL模式匹配

T-SQL模式匹配,sql,tsql,pattern-matching,sql-like,Sql,Tsql,Pattern Matching,Sql Like,我试图找到一种查询数据行的方法,使用另一个表中的“multivalue”管道分隔列作为WHERE子句。SQL SERVER 2005 以下是我对问题的最佳描述: 假设一个以管道分隔的列被设置为@LIST='Bob | Mary | Joe'这样的变量 那么我想找一个这样的匹配 Select * from Users where FirstName = 'Joe' 但扩展到 Select * from Users where FirstName "IS CONTAINED IN" @List

我试图找到一种查询数据行的方法,使用另一个表中的“multivalue”管道分隔列作为WHERE子句。SQL SERVER 2005

以下是我对问题的最佳描述:

假设一个以管道分隔的列被设置为@LIST='Bob | Mary | Joe'这样的变量

那么我想找一个这样的匹配

Select * from Users where FirstName = 'Joe'
但扩展到

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

将返回所有Bob、Mary和Joe条目。感谢您的帮助。

查看PATINDEX()函数。它有点有限,但应该满足您的需要。

查看PATINDEX()函数。它有点有限,但它应该满足您的需要。

您可以使用拆分的udf并将其连接到主查询。请参见下面的代码和示例。您的查询结果将如下所示。这是未经测试的,但希望这为您指明了正确的方向

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

您可以使用拆分的自定义项并将其连接到主查询。请参见下面的代码和示例。您的查询结果将如下所示。这是未经测试的,但希望这为您指明了正确的方向

Select A.* from Users A JOIN dbo.Fn_Split(@ValueArrayString, '|') B on A.FirstName = B.value 
安德鲁·诺维克

Select * from Users where FirstName IN (Select Item From udf_Txt_SplitTAB (@LIST, '|'))
安德鲁·诺维克

Select * from Users where FirstName IN (Select Item From udf_Txt_SplitTAB (@LIST, '|'))
怎么样

Select * from Users where CHARINDEX(FirstName + '|', @List + '|') > 0
有点恼人的是,您必须将管道分隔符附加到两个字符串中,但它可以工作,而且可能比函数快。

怎么样

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

有点恼人的是,您必须将管道分隔符附加到两个字符串中,但它可以工作,而且可能比函数快。

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

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

需要在两端添加管道

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

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

需要在两端添加管道

祝你好运。SQL用于查询规范化数据,而不是管道分隔字符串。祝你好运。SQL用于查询规范化的数据,而不是管道分隔的字符串。这非常简洁+1.(然而,我想知道为什么它不能仅仅是charindex(FirstName,@List)?这可能会给出错误的匹配,即如果列表中的一个名称是BillyBob,那么在没有额外分隔符的情况下,它将不正确地匹配。这非常简洁。+1!(然而,我想知道为什么它不能仅仅是charindex(FirstName,@List)?这可能会给出错误的匹配,即如果列表中的名称是BillyBob,则在没有附加分隔符的情况下,它将不正确地匹配。