使用存储过程检查字符串是不是包含 SQL Server 2005 中的子字符串
Posted
技术标签:
【中文标题】使用存储过程检查字符串是不是包含 SQL Server 2005 中的子字符串【英文标题】:Check if a string contains a substring in SQL Server 2005, using a stored procedure使用存储过程检查字符串是否包含 SQL Server 2005 中的子字符串 【发布时间】:2011-01-31 03:30:15 【问题描述】:我有一个字符串,@mainString = 'CATCH ME IF YOU CAN'
。我想检查ME
这个词是否在@mainString
里面。
如何在 SQL 中检查一个字符串是否有特定的子字符串?
【问题讨论】:
【参考方案1】:您可以只在谓词中使用通配符(在 IF、WHERE 或 ON 之后):
@mainstring LIKE '%' + @substring + '%'
或在这种特定情况下
' ' + @mainstring + ' ' LIKE '% ME[., ]%'
(如果您要查找整个单词,请将空格放在带引号的字符串中,或者如果 ME 可以是更大单词的一部分,则将它们排除在外)。
【讨论】:
如果你正在寻找单词匹配(你的第二个例子),你需要 a)在 @mainString 之前和之后添加一个空格(这样你就可以匹配第一个或最后一个单词),并且 b ) 删除标点符号 这对我来说比 CHARINDEX() 好,因为在我的特殊情况下,由于权限有限,我无法执行 CHARINDEX() 函数。 (如果您的列是nvarchar
,请不要忘记在所有字符串常量前加上N
前缀,否则您将获得每行转换)
这可能很明显,看起来LIKE
运算符支持RegEx,但LIKE
运算符是not RegEx per se;这种技术uses wildcard characters as literals 在搜索'% ME[., ]%'
时,[., ]
部分是通配符组,用于检查单词“ME”之后的可选句点、逗号或空格。谢谢!【参考方案2】:
CHARINDEX()
在较大的字符串中搜索子字符串,并返回匹配的位置,如果没有找到匹配则返回 0
if CHARINDEX('ME',@mainString) > 0
begin
--do something
end
编辑或来自 daniels 的回答,如果您想查找一个单词(而不是单词的子组件),您的 CHARINDEX
调用将如下所示:
CHARINDEX(' ME ',' ' + REPLACE(REPLACE(@mainString,',',' '),'.',' ') + ' ')
(为可能出现的任何其他标点符号添加更多递归 REPLACE() 调用)
【讨论】:
s/recursive/nested/ -- 如果REPLACE
调用自身,则为“递归”; “嵌套”是指函数调用的结果立即传递给另一个函数。
SQL 中的“ME”是否区分大小写,或者您是否还必须为“Me”和“me”执行 if 语句?
@a.powell - 取决于所涉及的排序规则。如果您需要一种或另一种方式,您总是可以在此测试中强制它。例如。比较select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')
和select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home')
。 (在排序规则中,CS
代表区分大小写,我相信您可以解决 CI
)。
@VincePanuccio - T-SQL 的 string 处理非常薄弱。 SQL 的优势在于基于集合的操作。在这种情况下(想要进行字符串处理,以及正则表达式将是一个明显的解决方案),更多的是他们为工作选择了错误的工具。以上是关于使用存储过程检查字符串是不是包含 SQL Server 2005 中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章