使用'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数据类型。
答案 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)
你的所有表达看起来都很奇怪:逻辑上的双重否定,为什么不使用
如果存在(选择...其中column_name ='value')
在自动禁用索引的地方使用否定(我从Oracle中知道)。
答案 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并删除尾随空格。