Как избежать строки для использования с оператором LIKE в SQL Server?
Я ищу что-то, что работает в SQL Server, аналогично @
символ в C#, который заставляет строку быть принятой как буквальную. Например:
string text = "abcd\\efg";
Output of text = abcd\efg
string text = @"abcd\\efg";
Output of text = abcd\\efg
Обратите внимание, как символ @ повлиял на строку, чтобы принять каждый символ как есть
Сейчас я не уверен, что это возможно, но вот моя проблема, и, возможно, есть лучший способ решить эту проблему. Рассмотрим следующий основной запрос:
SELECT [Name]
FROM [Test]
WHERE [Name] LIKE (@searchText + '%')
Моя проблема, если они поставят %
, _
или любой другой из тех специальных символов, которые могут повлиять на мое предложение like. Я хочу, чтобы матч действовал так же, как функция "начинается с". Так что я могу обратиться к @searchText, чтобы сказать, воспринимать это буквально, или, возможно, есть лучшее решение, о котором я не думаю?
Изменить: я не хочу, чтобы решение было очистки на стороне клиента. Мне нужно, чтобы этот хранимый процесс работал, не полагаясь на данные, передаваемые при очистке.
7 ответов
Для поиска "%" в качестве литерала, не являющегося подстановочным знаком в строке, необходимо экранировать как [%].
Теперь для SQL Server требуется только 3 символа: % _ [
Итак, создайте скалярный udf, чтобы обернуть это:
REPLACE(REPLACE(REPLACE(@myString, '[', '[[]'), '_', '[_]'), '%', '[%]')
Из-за простоты (иначе говоря, очень ограниченной) сопоставления с образцом в SQL ничего более сложного не требуется...
В TSQL вы можете заключить символы% и _ в квадратные скобки, например, так [%] [_] говорит SQL, что их следует рассматривать как литералы.
Я проверил и подтвердил, что это работает в SQL Server 7.0, 2000 и 2005.
http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx
Если вы параметризируете свой запрос, вам не нужно беспокоиться об этом.
ОБНОВИТЬ
Как отмечалось в комментариях рекурсивно, % по-прежнему необходимо экранировать даже в параметризованных запросах, я не осознавал, что linq to sql делал это автоматически, когда я тестировал.
Вы можете использовать ESCAPE 'x', где x - символ, который вы хотите использовать в качестве escape-символа. Linq to SQL делает это так
ГДЕ [Имя] НРАВИТСЯ @searchText ESCAPE '~'
где @searchText = [некоторый текст с символом%%]
или, как утверждают другие, его можно избежать с помощью [%]
Каждый символ, который нужно рассматривать буквально, должен быть заключен в квадратные скобки. Правая скобка понимается буквально напрямую, поэтому не заключайте ее в скобки.
Из документов:
Синтаксис
match_expression [NOT] LIKE шаблон [ESCAPE escape_character ]
Использовать ESCAPE
вариант вот так:
SELECT [Name]
FROM [Test]
WHERE [Name] LIKE (REPLACE(@searchText, '%', '%%') + '%') ESCAPE '%'
Если вы не хотите изменять входящий текст, вы можете использовать функцию "ВЛЕВО", чтобы создать свой собственный "STARTSWITH":
SELECT [Name]
FROM [Test]
WHERE @searchText = LEFT( [Name], LEN( @searchText ) )
(Обратите внимание, что вам, вероятно, нужно проделать дополнительную работу, чтобы обработать регистр NULL или пустую строку.)
РЕДАКТИРОВАТЬ: Удалено неправильное утверждение об использовании "LIKE" для поиска "%".
Я бы очистил строку во внешнем приложении, а не пытался делать хитрые вещи в SQL, чтобы обойти это.