logo

Как реализовать поиск без учёта регистра в MS SQL Server

Быстрый ответ

Для того чтобы обеспечить нечувствительность сравнения к регистру в SQL Server, можно привести обе части выражения к верхнему или нижнему регистру с помощью функций UPPER() или LOWER():

SQL
Скопировать код
SELECT * FROM таблица WHERE UPPER(столбец) = UPPER('ЗНАЧЕНИЕ');

или задать параметры сравнения с использованием COLLATE:

SQL
Скопировать код
SELECT * FROM таблица WHERE столбец = 'Значение' COLLATE SQL_Latin1_General_CP1_CI_AS;

В этом случае 'Value', 'VALUE' и 'value' будут считаться идентичными значениями сравнению SQL_Latin1_General_CP1_CI_AS.

Краткий обзор COLLATE

Директиву COLLATE можно применить на уровне отдельного запроса, столбца или даже целой базы данных. Если общие для SQL Server настройки чувствительности к регистру или настройки конкретной базы данных не устраивают вас, примените COLLATE в предложении WHERE:

SQL
Скопировать код
SELECT * FROM Сотрудники WHERE Имя COLLATE Latin1_General_CI_AS = 'джон';

Таким образом, написание имени 'John', будь то 'JOHN', 'joHn' или иные вариации, не имеет значения.

Важность знания настроек сравнения

Настройка сравнения, установленная для базы данных или столбца, может отличаться от общей для SQL Server, которая как правило нечувствительна к регистру. Для определения параметров сравнения столбца можно использовать этот запрос:

SQL
Скопировать код
SELECT имя, collation_name FROM sys.columns 
WHERE object_id = OBJECT_ID('ВашаТаблица');

Распространенные ошибки при работе с нечувствительностью к регистру

Будьте осмотрительны при работе с нечувствительностью к регистру в SQL Server:

  • Не забывайте, что VARBINARY предназначен для работы с бинарными данными.
  • Использование UPPER() не следует превращать в привычку, лучше использовать COLLATE, если такая возможность существует.
  • Не допускайте ошибочного предположения, что оператор LIKE всегда нечувствителен к регистру без настройки сравнения.

Сопоставление шаблонов и настройка сравнения

Поведение оператора LIKE тесно связано с настройками сравнения. К примеру:

SQL
Скопировать код
SELECT * FROM Продукты WHERE Наименование LIKE 'laptop';

В зависимости от настроек сравнения столбца Наименование или настроек сравнения базы данных по умолчанию, результаты могут включать 'Laptop', 'LAPTOP', 'laptop' и другие варианты.

Использование COLLATIONPROPERTY

Для получения дополнительных сведений о стандартном сравнении сервера используйте функцию COLLATIONPROPERTY:

SQL
Скопировать код
SELECT COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'ComparisonStyle');

Визуализация

Возьмите во внимание библиотеку, в которой есть два внешне схожих детективных романа:

  • "Кто сделал это?" (📖)
  • "КТО СДЕЛАЛ ЭТО?" (📚)

С помощью поиска, нечувствительного к регистру, вы обратитесь к библиотекарю (SQL Server) с просьбой найти 'кто сделал это', и получите обе книги, независимо от регистра в названии.

Почему использование COLLATE предпочтительнее функций

Явное указание нечувствительности к регистру с помощью COLLATE очень полезно при работе с неопределенным пользовательским вводом:

SQL
Скопировать код
SELECT * FROM Покупатели WHERE Фамилия COLLATE Latin1_General_CI_AS = 'смит';

Обход проблем совместимости

Если ваше приложение работает в различных средах SQL Server, COLLATE будет гарантировать его стабильное поведение:

SQL
Скопировать код
SELECT * FROM Склад WHERE НомерЧасти COLLATE Latin1_General_CI_AS = 'abc123';

Полезные материалы

  1. SQL server ignore case in a where expression – Stack Overflow – обсуждения сообщества и SQL-запросы с нечувствительностью к регистру.
  2. COLLATE (Transact-SQL) – SQL Server | Microsoft Learn – официальная документация для понимания настроек сравнения в SQL Server.
  3. SQL Server: LIKE Condition – руководство по использованию оператора LIKE и его чувствительности к регистру.
  4. Case Insensitive SQL Query Search – блог о поиске без учёта регистра в SQL Server.
  5. Handling Case Sensitivity in SQL Server – пособие по работе с чувствительностью к регистру в SQL Server.