使用存储过程检查字符串是不是包含 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 中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:检查数字列是不是包含格式化数字字符串中的值

如何检查 SQL 脚本是不是在 MS SQL Server 中成功执行?

如何检查 SQL 结果是不是包含换行符?

如何在创建存储过程之前检查它是不是存在

在包含动态 sql 的事务中嵌入对存储过程的调用

SQL Server 存储过程包含 SQL 或调用查看