在SQL Server 2005中,如何使用存储过程检查一个字符串是否包含子字符串?

282

我有一个字符串,@mainString = 'CATCH ME IF YOU CAN'。我想检查单词ME是否在@mainString中。

如何在SQL中检查一个字符串是否包含特定的子字符串?

2个回答

438

CHARINDEX()函数用于在较长的字符串中查找一个子字符串,并返回匹配的位置,如果没有找到则返回0。

if CHARINDEX('ME',@mainString) > 0
begin
    --do something
end

编辑或者根据 Daniel 的回答,如果你想要查找一个单词(而不是单词的子组件),那么你的CHARINDEX调用应该像这样:

CHARINDEX(' ME ',' ' + REPLACE(REPLACE(@mainString,',',' '),'.',' ') + ' ')

(对于可能出现的任何其他标点符号,添加更多递归的 REPLACE() 调用)


1
s/recursive/nested/ -- 如果“REPLACE”调用自身,则为“递归”;如果函数调用的结果立即传递给另一个函数,则为“嵌套”。 - anon
2
在SQL中,“ME”是否区分大小写,或者您还需要为“Me”和“me”编写if语句? - a.powell
7
@a.powell - 这取决于所涉及的排序规则。如果需要以某种方式进行比较,您可以在此测试中始终强制执行它。例如,请比较 select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home')。(在排序规则中,CS 表示区分大小写,我相信您可以理解 CI 的含义)。 - Damien_The_Unbeliever
3
T-SQL 的字符串处理功能被广泛认为是比较薄弱的。SQL 的强项在于集合操作。在这种情况下(需要进行字符串处理,而正则表达式是显而易见的解决方案),更多的是他们选择了错误的工具来完成任务。 - Damien_The_Unbeliever

133

您可以在谓词中(在IF、WHERE或ON之后)使用通配符:

@mainstring LIKE '%' + @substring + '%'

或者在这个特定的情况下

' ' + @mainstring + ' ' LIKE '% ME[., ]%'

如果您要查找整个单词,请在引用字符串中放置空格;如果ME可以是更长单词的一部分,则可以省略空格。


4
如果您正在寻找单词匹配(第二个例子),则需要a)在@mainString之前和之后添加空格(以便可以匹配第一个或最后一个单词),并且b)删除标点符号。 - Damien_The_Unbeliever
4
对于我来说,这比CHARINDEX()更好,因为在我的特定情况下,由于权限有限,我无法执行CHARINDEX()函数。 - James T Snell
2
如果您的列是 nvarchar,请不要忘记在所有字符串常量前加上 N 前缀,否则会导致每行转换。 - Richard Szalay
这可能很明显,看起来 LIKE 操作符支持正则表达式,但是 LIKE 操作符本身并不是正则表达式(参见 https://dev59.com/5Gox5IYBdhLWcg3w3X5S#9076427);该技术在搜索 '% ME[., ]%' 时使用通配符字符作为字面量(参见 https://learn.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15#using-wildcard-characters-as-literals),其中 [., ] 部分是通配符字符组,用于检查单词 "ME" 后面是否有可选的句号、逗号或空格。谢谢! - Nate Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接