2013-04-30 61 views
2

在Microsoft SQL中使用“不喜欢”而没有任何%符号并使用不等号运算符<>是否有任何实际区别?例如:Microsoft SQL'不喜欢'vs <>

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

我发现我一直在使用不喜欢的习惯(它的速度更快输入阅读我自己的代码时感觉更直观)和我想知道是否有可能会导致不同于不平等的行为。我在其他问题中读到'like'比'equals'慢,但我更关心比较的结果。 进行比较时,我几乎总是使用varchar数据类型。

回答

2

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

有更多的 “外卡” 比%_

这些都是不一样的

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。

+0

谢谢,但我想知道具体是否有任何区别时,**没有**通配符被使用。 – 2013-04-30 17:56:08

+1

是的,一个像必须评估通配符的字符串。在检查它们之前,它不知道没有通配符。如果没有通配符,那么从我所看到的将它视为<>。 – Paparazzi 2013-04-30 17:59:57

+0

我想我会试图打破我的(坏)习惯,以避免sl sl。 – 2013-05-02 18:10:27

0
  1. 还有另一个特殊符号'_'(任何单个字符)。我认为用'喜欢'和可能的方式来解决未来头痛是不好的主意。
  2. 你所有的表情似乎很奇怪:在逻辑双重否定,为什么不是否存在使用

    (选择...其中列名=“值”)

  3. 在使用索引自动禁用使用否定(正如我从Oracle那里了解到的)。

  4. 是的,我想使用像也影响查询
+0

Ack,你说得对。我是从最近的一个导入项目复制的,我复制了if语句的第一部分和另一部分的第二部分。如果存在,我将编辑删除'不是'。 – 2013-04-30 18:07:47

+0

使用'如果不存在(select * from table_name where column_name ='myvalue')' – refeline 2013-04-30 18:16:10

1

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

另外,LIKE是“标记”语法 - 除非必须进行模式匹配,否则通常不会使用它。其他人阅读你的代码将花费时间试图弄清楚为什么你使用LIKE,当你的意思是<>。考虑到你想要做的事情的语义意思是“不等于”,使用指定的操作员将会导致最大的清晰度。

0

除了其他问题中提到的其他问题(潜在的问题应该是变量是否包含文字“%”或“_”)我会说这对性能也是不利的:SQL Server将仍然扫描字符串寻找模式,只是找不到任何东西。

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

不可否认,您不会损失超过几毫秒的时间,但如果几个用户几乎同时重复调用此查询,那么这些时间可能会大量增加。

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的前后空格都被删除。