2013-04-30 36 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的前後空格都被刪除。