使用存储过程检查字符串是否包含SQL Server 2005中的子字符串

NLV*_*NLV 231 t-sql sql-server string stored-procedures sql-server-2005

我有一根绳子,@mainString = 'CATCH ME IF YOU CAN'.我想检查这个词是否在ME里面@mainString.

如何在SQL中检查字符串是否具有特定的子字符串?

Dam*_*ver 380

CHARINDEX()在较大的字符串中搜索子字符串,并返回匹配的位置,如果未找到匹配则返回0

if CHARINDEX('ME',@mainString) > 0
begin
    --do something
end
Run Code Online (Sandbox Code Playgroud)

编辑或来自daniels的答案,如果您想要找到一个单词(而不是单词的子组件),您的CHARINDEX调用将如下所示:

CHARINDEX(' ME ',' ' + REPLACE(REPLACE(@mainString,',',' '),'.',' ') + ' ')
Run Code Online (Sandbox Code Playgroud)

(为可能发生的任何其他标点符号添加更多递归REPLACE()调用

  • @ a.powell - 取决于所涉及的整理.如果您需要这种方式,您可以随时在此测试中强制它.例如,比较`select CHARINDEX('ME'collat​​e Latin1_General_CS_AS,'Home')`和`select CHARINDEX('ME'collat​​e Latin1_General_CI_AS,'Home')`.(在整理中,`CS`代表Case Sensitive,我相信你可以解决`CI`). (4认同)
  • 好的,我用了PATINDEX。谢谢! (2认同)
  • “ ME”在SQL中是否区分大小写,或者您还必须对“ Me”和“ me”执行if语句? (2认同)
  • @VincePanuccio-众所周知,T-SQL的* string *处理能力很弱。SQL的优势在于基于集合的操作。在这种情况下(想要进行字符串处理,而正则表达式将是显而易见的解决方案),更多的是他们为该工作选择了错误的工具。 (2认同)

Dan*_*lan 117

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

@mainstring LIKE '%' + @substring + '%'
Run Code Online (Sandbox Code Playgroud)

或在这种特殊情况下

' ' + @mainstring + ' ' LIKE '% ME[., ]%'
Run Code Online (Sandbox Code Playgroud)

(如果你正在寻找整个单词,请将空格放在引用的字符串中,如果ME可以成为更大单词的一部分,则将它们保留在外面).

  • 如果你正在寻找单词匹配(你的第二个例子),你需要a)在@mainString之前和之后添加一个空格(这样你可以匹配第一个或最后一个单词),和b)删除标点符号 (3认同)
  • 对我而言,这比CHARINDEX()更好,因为在我的特殊情况下,由于权限有限,我无法执行CHARINDEX()函数。 (2认同)
  • (如果您的列是 `nvarchar`,请不要忘记在所有字符串常量前加上 `N` 前缀,否则您将获得每行转换) (2认同)