2017-05-21 9 views
2

私は、母音で始まらない母音で終わらない列の値を取り出すための2つのクエリを書いています。これらの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]' 

私によると、彼らは簡単にテストケースを渡すのと同じクエリで、同じ結果をフィルタリングする必要があります。いずれのシナリオでも、これらの2つの異なるクエリがありますか?

答えて

1

これらのクエリはどちらも、名前の先頭または末尾に非母音を持つ都市を取得します。同じ結果セットを返さなければなりません。たとえば、「マイアミ」は両方のクエリに一致します。

ただし、と同じではありません。下位のlike演算子を2回実行し、もう1回は実行します。この場合、パフォーマンスの差異は目立たない可能性がありますが、他の状況では違いが生じる可能性があります。

あなたはその後、自分の名前の先頭最後に母音を持っていない都市の場合:

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

か:

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

を「マイアミ」は、これらの条件に一致しないがしかし、 "ボストン"はそうです。

2

いいえ、それらは同じではありません。イベントabはまた

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

によって与えられる

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

は、a and bは、基本的に設定された交差点でイベントlike '[aeiou]%[aeiou]'、に対応する:これは、ド・モルガンの法則を適用することによって見ることができますすべてのイベントを含む2つのセットのうちab

EDIT:前の文が間違っていて、1要素文字列に対して間違った結果が生成されます。セットa and bを見つけるために、今、対照的に、like '[aeiou]%[aeiou]'は、最初と最後の要素の間に他の任意の文字を持っている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} } 

考えます。

ご迷惑をおかけして申し訳ありません。

+0

はい、私は思っていましたが、@ Stephan Lechnerが指摘したように私は懐疑的でした。クエリが異なる動作をするテストケースはありますか? –

+0

@ Kajal_T:まあまあ、まったく同じではありません。私は理論的な基盤を掲げます(エラーは最後のステップでした)。 – davidhigh

5

いいえ、動作は異なります。長さが1の文字列がパターン[aeiou]%[aeiou]と一致しないため、[aeiou]%%[aeiou]の両方に一致する可能性があるため、都市とのいくつかの相違点は"a"のようです。ちょうどそれを試してみて、実際には違いがあります。一つは、まだ両方のクエリのどれが正しく'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]' 

2番目のクエリが返されます。xyz、axyz、xyza、a。これは、条件が

NOT LIKE '[aeiou]%[aeiou]' 

の場合、母音で開始して終了しないことを意味するためです。したがって、axyzaは選択されませんが、axyzとxyzaは選択されていますが、それらは存在してはいけません。

関連する問題