【问题标题】:T-SQL Pattern matchingT-SQL 模式匹配
【发布时间】:2009-02-13 01:14:00
【问题描述】:

我正在尝试通过在另一个表中使用“多值”管道分隔列作为 WHERE 子句来找到一种查询数据行的方法。 SQL 服务器 2005

这是我对问题的最佳描述:

想象一个用管道分隔的列设置为像@LIST = 'Bob|Mary|Joe' 这样的变量

然后我正在尝试找到这样的匹配项

Select * from Users where FirstName = 'Joe'

但扩展为

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

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

【问题讨论】:

  • 祝你好运。 SQL 用于查询规范化数据,而不是管道分隔的字符串。

标签: sql tsql pattern-matching sql-like


【解决方案1】:

怎么样

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

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

【讨论】:

  • 这很整洁。 +1! (但是,我想知道为什么它不能只是 charindex(FirstName,@List) ?
  • 这可能会导致错误匹配,即如果列表中的名称是 BillyBob,那么如果没有额外的分隔符,它就会匹配不正确。
【解决方案2】:

您可以使用拆分 udf 并将其加入到您的主查询中。有关代码和示例,请参阅此 link。您的查询最终看起来像这样。这是未经测试的,但希望这能为您指明正确的方向。

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

【讨论】:

    【解决方案3】:

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

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

    需要在两端加管道

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        See udf___Txt_SplitTab 来自安德鲁·诺维克

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

        【讨论】:

          猜你喜欢
          • 2011-11-02
          • 1970-01-01
          • 1970-01-01
          • 2013-02-12
          • 2012-10-18
          • 1970-01-01
          • 2010-10-29
          • 2019-05-26
          • 2018-05-29
          相关资源
          最近更新 更多