2017-05-21 72 views
2

我已經寫了兩個查詢來獲取不是以元音開頭或者不以元音結尾的列值。這兩個SQL Server查詢是否一樣?

查詢1:

SELECT DISTINCT CITY 
FROM STATION 
WHERE city NOT LIKE '[aeiou]%' 
    OR city NOT LIKE '%[aeiou]' 

問題2:

SELECT DISTINCT CITY 
FROM STATION 
WHERE city NOT LIKE '[aeiou]%[aeiou]' 

據我,它們應該是相同的查詢,因爲它們容易通過測試案例和過濾相同的結果。在任何情況下這兩個不同的查詢?

回答

1

這兩個查詢都會在其名稱的開頭或結尾處獲取具有非元音的城市。他們應該返回相同的結果集。例如,「邁阿密」匹配這兩個查詢。

但是,它們不是相同。一個將執行底層like運算符兩次,另一個執行一次。在這種情況下,性能差異可能不明顯,但在其他情況下可能會有所不同。

如果你想沒有元音開頭結束他們的名字,那麼城市:

WHERE city not like '[aeiou]%' AND city not like '%[aeiou]' 

或:

WHERE city LIKE '[^aeiou]%[^aeiou]' 

「邁阿密」不符合這些條件,但「波士頓」呢。

2

不,他們是不一樣的。

!a or !b = !(a and b), 

在事件ab

a = like '[aeiou]%' 
b = like '%[aeiou]'. 

而且給出a and b對應於事件like '[aeiou]%[aeiou]',這基本上是一個交集:它可以通過德摩根規則的應用可以看出兩組中包含所有事件ab

編輯:前面的句子是錯誤的,它會產生一個元素字符串的錯誤結果。爲了找到一組a and b,考慮

a = { x | first element in {a,e,i,o,u} } 
b = { x | last element in {a,e,i,o,u} } 

因此,

a AND b = { x | first AND last element in {a,e,i,o,u} } 

現在,相比之下,like '[aeiou]%[aeiou]'是在第一和最後一個元素之間的另一種可選的性格a AND b的子集。

對不起,我感到困惑。

+0

是的,我認爲相同,但正如@Stephan Lechner指出的,我對此持懷疑態度,是否有任何測試用例的查詢行爲不同。 –

+0

@Kajal_T:好的,完全正確,它們不完全相同。我將發佈理論基礎(錯誤在最後一步)。 – davidhigh

5

不,他們的行爲不同。我預計與"a"等城市存在一些差異,因爲長度爲1的字符串不會匹配[aeiou]%[aeiou],但可能與[aeiou]%%[aeiou]都匹配。剛剛嘗試過,實際上有不同之處。人們仍然可以討論這兩種查詢的正確解釋'a',但至少這兩個查詢不同的表現:

SELECT * 
    FROM (VALUES ('aasfa') 
      , ('basda') 
      , ('asdfb') 
      , ('a') 
     ) t1 (c) 
     where c not like '[aeiou]%[aeiou]'; 

結果:

c 
----- 
basda 
asdfb 
a 

查詢:

SELECT * 
    FROM (VALUES ('aasfa') 
      , ('basda') 
      , ('asdfb') 
      , ('a') 
     ) t1 (c) 
     where c not like '[aeiou]%' 
or c not like '%[aeiou]' 

結果:

c 
----- 
basda 
asdfb 
1

不,他們不一樣。 這裏是樣本輸入:xyz,axyz,xyza,axyza,a。

第一個查詢將返回:xyz,axyz,xyza。在這個'AND'應該用來獲得所需的輸出。下面的查詢將僅返回xyz。

SELECT DISTINCT CITY 
FROM STATION 
WHERE city NOT LIKE '[aeiou]%' 
    AND city NOT LIKE '%[aeiou]' 

第二個查詢將返回:xyz,axyz,xyza,a。這是因爲條件

NOT LIKE '[aeiou]%[aeiou]' 

意味着它不應該以元音開始AND結束。因此axyza沒有被選中,而a,axyz和xyza被選中,儘管他們不應該這樣做。