【问题标题】:Usage on Patindex() functionPatindex() 函数的用法
【发布时间】:2011-11-17 14:18:27
【问题描述】:

我正在使用patindex 进行“MD”或“DO”的模式搜索。下面的语句返回3。 我是否以错误的方式使用它,还是有另一种检查条件的方式?

select PATINDEX ('%[MD,DO]%','FHoisegh MD')

【问题讨论】:

  • PATINDEX 没有任何类型的交替运算符,您需要为此或两个表达式使用 CLR 和正则表达式
  • @Ratz 我的答案不起作用,如 cmets 所示。如果您不接受我的回答,我可以删除它。

标签: sql-server-2008


【解决方案1】:
select T.Value
from (values
        (charindex('MD', 'FHoisegh MD')),
        (charindex('DO', 'FHoisegh MD'))
     ) as T(Value)
where T.Value > 0

【讨论】:

    【解决方案2】:
    select PATINDEX ('%[MD][DO]%','FHoisegh MD')  -- returns 10
    

    正如您在问题中所说,它正在寻找方括号之间的 5 个字符中的任何一个,并在位置 3 处找到“o”。例如,

    select PATINDEX ('%[MD,DO]%','F,Hoisegh MD')  -- returns 2
    

    正如@Filip De Vos 指出的那样,'%[MD][DO]%' 也将匹配MO。我能想到的唯一处理方法是减去MO 的索引:

    select PATINDEX ('%[MD][DO]%','FHoisegh MO') - PATINDEX('%MO%', 'FHoisegh MO') -- returns 0
    

    如果 MDDO 是您要搜索的唯一术语,这可能就足够了。对于其他任何事情,我会说寻找其他方法来做到这一点。

    【讨论】:

    • 所以在你的解决方案中它也会找到MO
    • 您的新版本中的什么数字结果表示成功? ALMODOVAR 包含 DO 但您的新版本返回 0
    【解决方案3】:

    结合使用 PATINDEX/CHARINDEX、NULLIF 和 ISNULL 函数,您可以获得所需的结果:

    DECLARE @text VARCHAR(100) = 'FHoisegh MXD';
    SELECT ISNULL( NULLIF(PATINDEX('%MD%',@text),0), PATINDEX('%DO%',@text) )
    

    如果搜索三个或更多值(例如 DO/RE/MI)而不是 ISNULL 函数可以使用 COALESCE 函数:

    DECLARE @text VARCHAR(100) = 'abcMODOKO';
    SELECT COALESCE( NULLIF(PATINDEX('%DO%',@text),0), NULLIF(PATINDEX('%RE%',@text),0), PATINDEX('%MI%',@text) )
    

    【讨论】:

      猜你喜欢
      • 2013-08-19
      • 1970-01-01
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      相关资源
      最近更新 更多