Microsoft SQL'不喜欢'vs<>

时间:2013-04-30 17:33:51

标签: sql sql-server tsql comparison sql-like

使用'not like'没有任何%符号和使用不等运算符<>之间是否有任何真正的区别?在Microsoft SQL?例如:

if exists (select * from table_name where column_name not like @myvariable)

if exists (select * from table_name where column_name not like 'myvalue')

if exists (select * from table_name where column_name <> @myvariable)

if exists (select * from table_name where column_name <> 'myvalue')

我注意到我有使用不喜欢的习惯(在阅读我自己的代码时打字速度更快,感觉更直观)我想知道是否有可能导致行为不同于非-等于。我在其他问题中读到'喜欢'比'等于'慢,但我更关注这里的比较结果。 在进行比较时,我几乎总是使用varchar数据类型。

5 个答案:

答案 0 :(得分:2)

&LT;&GT;不会评估外卡 &LT;&GT; '%'是对文字%

的搜索

还有比“_ _

更多的”外卡“

这些不一样

  SELECT TOP 1000 [ID],[word]
  FROM [FTSwordDef]
  where [word] like '[a-z]a'


  SELECT TOP 1000 [ID],[word]
  FROM [FTSwordDef]
  where [word] = '[a-z]a'

使用&lt;&gt;当你有一个文字匹配

当您想使用“外卡”时使用LIKE

表达式的评估方式不同,仅仅假设它们是可互换的,只使用LIKE是草率的。

答案 1 :(得分:1)

在您给出的示例中,查询的最终结果没有区别。但是,我认为这可能是一个坏主意。您正在打开与保留字符相关的错误,这些错误可能很难追踪(LIKE使用%和_作为保留字符进行模式匹配)。如果你正在对WHERE子句进行硬编码,那可能不是问题,但你也有变量。您的应用程序需要检查变量是否包含%或_,以避免错误和安全漏洞。

此外,LIKE是“标记”语法 - 除非必须进行模式匹配,否则通常不会使用它。其他人在阅读你的代码时会花时间试图找出你在实际意味着&lt;&gt;时使用LIKE的原因。考虑到您尝试做的事情的语义含义是“不相等”,使用指定的运算符将导致最大的清晰度。

答案 2 :(得分:0)

  1. 还有另一个特殊符号'_'(任何单个字符)。我认为使用'喜欢'和未来可能会让人头痛的方法是个坏主意。
  2. 你的所有表达看起来都很奇怪:逻辑上的双重否定,为什么不使用

    如果存在(选择...其中column_name ='value')

  3. 在自动禁用索引的地方使用否定(我从Oracle中知道)。

  4. 是的,我认为使用也会影响查询的执行计划

答案 3 :(得分:0)

除了其他答案中提到的其他问题(潜在的问题,如果变量包含文字“%”或“_”)我会说它对性能也有害:SQL Server仍会扫描字符串寻找模式,却一无所获。

因此,您的查询在语义上等同于首先使用不同的运算符,但“&lt;&gt;”除外不会强制SQL S.搜索字符串,寻找要查找的模式。

不可否认,如果几个用户几乎同时重复调用此查询,那么你不会失去超过几毫秒的时间,但这可能会导致很多额外的时间。

答案 4 :(得分:0)

比较nchar和nvarchar列时,您会得到不同的结果。试试这个:

CREATE TABLE #Test (ColA nchar(10), ColB nvarchar(10))

INSERT INTO #Test SELECT N'test    ', N'test '

SELECT * FROM #Test WHERE ColA = ColB

SELECT * FROM #Test WHERE ColA LIKE ColB

DROP TABLE #Test

这可能发生,因为当你使用“=”时,sql server必须将比较的两边都转换为相同的数据类型,然后将nchar列转换为nvarchar并删除尾随空格。