【问题标题】: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 中检查一个字符串是否有特定的子字符串?

【问题讨论】:

    标签: sql-server string tsql stored-procedures sql-server-2005


    【解决方案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 的优势在于基于集合的操作。在这种情况下(想要进行字符串处理,以及正则表达式将是一个明显的解决方案),更多的是他们为工作选择了错误的工具。
    猜你喜欢
    • 2011-11-09
    • 2013-05-18
    • 1970-01-01
    • 2021-12-20
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2013-02-05
    相关资源
    最近更新 更多