2

在 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')

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

4

5 回答 5

4

<> 不会评估通配符
<> '%' 是对文字 % 的搜索

“通配符”比 %_ 多

这些不一样

  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'

当你有文字匹配时使用 <>

当你想使用“通配符”时使用 LIKE

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

于 2013-04-30T17:54:38.803 回答
2

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

此外,LIKE 是“标记”语法——除非您必须进行模式匹配,否则您通常不会使用它。阅读您的代码的其他人会花时间试图弄清楚您为什么使用 LIKE,而实际上您的意思是 <>。考虑到您尝试做的事情的语义是“不等于”,使用指定的运算符将导致最大的清晰度。

于 2013-04-30T18:09:36.027 回答
0
  1. 还有另一个特殊符号“_”(任何单个字符)。我认为使用“喜欢”是个坏主意,而且将来可能会让人头疼。
  2. 你所有的表达似乎都很奇怪:逻辑中的双重否定,为什么不使用

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

  3. 在 where 中使用否定会自动禁用使用索引(据我所知,Oracle)。

  4. 是的,我认为使用 like 也会影响查询的执行计划
于 2013-04-30T17:59:52.073 回答
0

除了其他答案中提到的其他问题(如果变量包含文字“%”或“_”可能会出现问题),我想说这对性能也很不利:SQL Server 仍然会扫描字符串以查找模式,只是为了一无所获。

因此,您的查询在语义上等同于首先使用 different-from 运算符,除了“<>”不会强制 SQL S. 搜索字符串以查找要查找的模式。

诚然,您不会损失超过几毫秒的时间,但是如果这个查询几乎同时被多个用户重复调用,那么这些时间总计可能会增加很多额外的时间。

于 2013-04-30T20:21:28.177 回答
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 并删除尾随空格。

于 2013-09-26T19:34:07.920 回答