我使用patindex
进行“MD”或“DO”的模式搜索。以下语句返回3
。
我是以错误的方式使用它还是有另一种检查条件的方法?
select PATINDEX ('%[MD,DO]%','FHoisegh MD')
答案 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
如果MD
和DO
是您要搜索的唯一条款,这可能就足够了。对于其他任何事情,我会说寻找其他方法来做到这一点。
答案 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) )