检查字符串是否不包含另一个字符串

68

在T-SQL中,如何检查一个字符串是否不包含另一个字符串?

我有一个可能是 "Oranges Apples" 的 nvarchar

我想要进行一次更新,例如,一个列不包含“Apples”。

如何实现这个目标?


1
请在您的问题标题中更加准确。 "包含另一个字符串"!= "不包含另一个字符串" - lordcheeto
-1 for inaccurate title. - Matt Parkins
1
我改了标题。迟做总比不做好 :) - Dofs
4个回答

107
WHERE NOT (someColumn LIKE '%Apples%')

2
为什么我没有想到,我一直在寻求更高级的东西 :) - Dofs
请使用单引号而不是双引号:'%Apples%'。我尝试编辑帖子,但是SO要求编辑的字符数必须大于六个。 - DeveloperDan
3
对于静态字符串“Apples”,这个方法可行,但对于可能包含通配符(如“%”、“_”)的动态字符串则无法正常工作。例如,如果搜索包含“5% reduction”的列,则LIKE运算符也会匹配包含“50% reduction”和“5 cents reduction”的列。@marc_s提供的使用CHARINDEX的解决方案在这些情况下能正常工作,并且在我看来应该被接受为答案。 - Joe
如果someColumn包含NULL,则我会将someColumn包装为ISNULL(someColumn,''),因为上面的表达式不会按预期工作。 - user3088037

26

或者,你也可以使用这个:

WHERE CHARINDEX(N'Apples', someColumn) = 0

不确定哪个执行效果更好-你需要测试一下!:-)

Marc

更新:性能似乎与另一种解决方案(WHERE someColumn NOT LIKE'% Apples%')基本相当,所以这只是一个关于你个人喜好的问题。


2
如果要匹配的文本是动态的,而不是像“苹果”这样的静态字符串,则此方法更优,因为您无需担心通配符(如“%”,“_”)会被LIKE运算符匹配。 - Joe
@Joe 如果你想要严谨一些,那么这个方法也不是在所有情况下都适用。CHARINDEX 不区分大小写。所以如果你在一堆苹果中寻找一个 Apple,你会得到整个列表。我知道这篇文章已经发布了几年,但是两种答案都是有效的,具体取决于主题,没有一个答案可以覆盖所有情况。你对被接受的答案给出的负分似乎有点... 是 pernickety 这个词吗? - DDuffy
@DDuffy - LIKE和CHARINDEX都受输入排序规则的影响,这可能是区分大小写的,也可能不区分大小写。对于匹配用户输入的字符串,如果用户预计知道如何使用和转义通配符(如%),则使用LIKE是合适的;如果用户只想匹配文本(例如匹配所有包含“2%折扣”的值,而不会意外地包括那些有20%折扣的值),则使用CHARINDEX更好。 - Joe

10

将此作为您的 WHERE 条件使用

WHERE CHARINDEX('Apples', column) = 0 

8
您得到的答案假设要比较的是静态文本。如果您想比较另一列(比如,您正在连接两个表,并且想要找到其中一个表中的列是另一个表中列的一部分的情况),可以这样做。
WHERE NOT (someColumn LIKE '%' || someOtherColumn || '%')

2
如果someOtherColumn包含通配符字符,如“%”、“_”,则无法正常工作。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接