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


Answers:


395

CHARINDEX()在较大的字符串中搜索子字符串,然后返回匹配的位置;如果找不到匹配项,则返回0

if CHARINDEX('ME',@mainString) > 0
begin
    --do something
end

编辑或从丹尼尔斯的答案中,如果您想查找一个单词(而不是单词的子部分),则CHARINDEX调用将类似于:

CHARINDEX(' ME ',' ' + REPLACE(REPLACE(@mainString,',',' '),'.',' ') + ' ')

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


2
好的,我用了PATINDEX。谢谢!
NLV

1
s / recursive / nested /-如果REPLACE称为“递归”,则为“递归” ;“嵌套”是指函数调用的结果立即传递给另一个函数。
基金莫妮卡的诉讼

2
“ ME”在SQL中是否区分大小写,或者您还必须对“ Me”和“ me”执行if语句?
a.powell

5
@ a.powell-取决于所涉及的整理。如果您需要一种或另一种方法,则可以始终在此测试中强制使用它。例如比较select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home')。(在排序规则中,CS代表“区分大小写”,我相信您可以解决CI)。
Damien_The_Unbeliever

2
@VincePanuccio-众所周知,T-SQL的字符串处理功能很弱。SQL的优势在于基于集合的操作。在这种情况下(想要进行字符串处理,而正则表达式将是显而易见的解决方案),更多的是他们为该工作选择了错误的工具。
Damien_The_Unbeliever

120

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

@mainstring LIKE '%' + @substring + '%'

或者在这种情况下

' ' + @mainstring + ' ' LIKE '% ME[., ]%'

(如果要查找整个单词,请在带引号的字符串中放置空格,如果ME可以是较大单词的一部分,则将其排除在外)。


3
如果您要查找单词匹配项(第二个示例),则需要a)在@mainString之前和之后添加一个空格(以便您可以匹配第一个或最后一个单词),以及b)删除标点符号
Damien_The_Unbeliever

2
对我来说,这比CHARINDEX()更好,因为在我的特殊情况下,由于权限有限,我无法执行CHARINDEX()函数。
James T Snell

1
(只要N您的列是an nvarchar,别忘了在所有字符串常量之前加上前缀,否则会进行逐行转换)
Richard Szalay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.