【发布时间】:2011-01-31 03:30:15
【问题描述】:
我有一个字符串,@mainString = 'CATCH ME IF YOU CAN'。我想检查ME这个词是否在@mainString里面。
如何在 SQL 中检查一个字符串是否有特定的子字符串?
【问题讨论】:
标签: sql-server string tsql stored-procedures sql-server-2005
我有一个字符串,@mainString = 'CATCH ME IF YOU CAN'。我想检查ME这个词是否在@mainString里面。
如何在 SQL 中检查一个字符串是否有特定的子字符串?
【问题讨论】:
标签: sql-server string tsql stored-procedures sql-server-2005
您可以只在谓词中使用通配符(在 IF、WHERE 或 ON 之后):
@mainstring LIKE '%' + @substring + '%'
或在这种特定情况下
' ' + @mainstring + ' ' LIKE '% ME[., ]%'
(如果您要查找整个单词,请将空格放在带引号的字符串中,或者如果 ME 可以是更大单词的一部分,则将它们排除在外)。
【讨论】:
nvarchar,请不要忘记在所有字符串常量前加上N 前缀,否则您将获得每行转换)
LIKE 运算符支持RegEx,但LIKE 运算符是not RegEx per se;这种技术uses wildcard characters as literals 在搜索'% ME[., ]%' 时,[., ] 部分是通配符组,用于检查单词“ME”之后的可选句点、逗号或空格。谢谢!
CHARINDEX() 在较大的字符串中搜索子字符串,并返回匹配的位置,如果没有找到匹配则返回 0
if CHARINDEX('ME',@mainString) > 0
begin
--do something
end
编辑或来自 daniels 的回答,如果您想查找一个单词(而不是单词的子组件),您的 CHARINDEX 调用将如下所示:
CHARINDEX(' ME ',' ' + REPLACE(REPLACE(@mainString,',',' '),'.',' ') + ' ')
(为可能出现的任何其他标点符号添加更多递归 REPLACE() 调用)
【讨论】:
REPLACE 调用自身,则为“递归”; “嵌套”是指函数调用的结果立即传递给另一个函数。
select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home') 和select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home')。 (在排序规则中,CS 代表区分大小写,我相信您可以解决 CI)。