SQL LIKE без подстановочных знаков такой же, как '='? - PullRequest
38 голосов
/ 01 января 2009

Я знаю, что это довольно простой вопрос, и я думаю Я знаю ответ ... но я хотел бы подтвердить.

Эти запросы действительно эквивалентны?

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

Возможно, при использовании, как без подстановочных знаков, возникают проблемы с производительностью?

У меня есть приложение, которое по выбору использует LIKE и групповые символы. SP в настоящее время делает то же самое и добавляет подстановочные знаки - я думаю просто обновить запрос, чтобы использовать лайк, но приложение должно добавлять подстановочные знаки по мере необходимости.

Ответы [ 3 ]

26 голосов
/ 01 января 2009

Как говорит @ocdecio, если оптимизатор достаточно умен, разницы не должно быть, но если вы хотите убедиться в том, что происходит за кулисами, вам следует сравнить планы выполнения двух запросов.

11 голосов
/ 13 июня 2016

Оригинальный ответ от Мэтта Уитфилда из здесь

Существует разница между = и 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  '
7 голосов
/ 01 января 2009

Любой хороший оптимизатор уменьшит первое выражение до второго.

...