web-dev-qa-db-ja.com

'='と同じワイルドカードのないSQLLIKE?

私はこれがかなり基本的な質問であることを知っています、そして私は考える私は答えを知っています...しかし私は確認したいと思います。

これらのクエリは本当に同等ですか?

SELECT * FROM FOO WHERE BAR LIKE 'X'
SELECT * FROM FOO WHERE BAR ='X'

おそらく、ワイルドカードなしでlikeを使用すると、パフォーマンスのオーバーヘッドが発生しますか?

オプションでLIKEとワイルドカードを使用するアプリがあります。 SPは現在、likeを実行し、ワイルドカードを追加します-likeを使用するようにクエリを更新することを考えていますが、必要に応じてアプリにワイルドカードを追加させます。

42
javamonkey79

@ocdecioが言うように、オプティマイザーが十分に賢い場合は違いはありませんが、舞台裏で何が起こっているかを確認したい場合は、2つのクエリの実行プランを比較する必要があります。

29
CMS

ここ からのマットホイットフィールドによる元の回答

=LIKEには違いがありますLIKEを使用して文字列比較を実行すると、パターン文字列内のすべての文字が重要になります。これには、先​​頭または末尾のスペースが含まれます。

したがって、charまたはncharであり、nvarcharまたはvarcharではない列がある場合、末尾のスペースが原因で異なる結果が得られます。

この動作を再現するための小さな例:

CREATE TABLE #temp (nam [varchar](MAX))
INSERT INTO [#temp] ([nam])
VALUES ('hello')
INSERT INTO [#temp] ([nam])
VALUES ('hello  ')

SELECT * FROM #temp WHERE [nam] = 'hello  '

SELECT * FROM #temp WHERE [nam] LIKE 'hello  '
14
CSharpie

優れたオプティマイザは、最初の式を2番目の式に減らします。

7
Otávio Décio