用于Patindex()函数

时间:2011-09-15 06:02:17

标签: sql-server-2008

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

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

3 个答案:

答案 0 :(得分:3)

select T.Value
from (values
        (charindex('MD', 'FHoisegh MD')),
        (charindex('DO', 'FHoisegh MD'))
     ) as T(Value)
where T.Value > 0

答案 1 :(得分: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是您要搜索的唯一条款,这可能就足够了。对于其他任何事情,我会说寻找其他方法来做到这一点。

答案 2 :(得分:2)

结合使用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) )