SQL server игнорирует регистр в выражении where



Как построить SQL-запрос (MS SQL Server), где предложение "where" нечувствительно к регистру?



SELECT * FROM myTable WHERE myField = 'sOmeVal'


Я хочу, чтобы результаты вернулись, игнорируя случай

721   6  

6 ответов:

в конфигурации базы данных SQL Server по умолчанию сравнение строк are регистр. Если база данных переопределяет этот параметр (с помощью альтернативных параметров сортировки), необходимо указать, какие параметры сортировки следует использовать в запросе.

SELECT * FROM myTable WHERE myField = 'sOmeVal' COLLATE SQL_Latin1_General_CP1_CI_AS

обратите внимание, что параметры сортировки, которые я предоставил, - это просто пример (хотя он, скорее всего, будет отлично работать для вас). Более подробное описание параметров сортировки SQL Server можно найти здесь.

обычно сравнения строк не учитывают регистр. Если ваша база данных настроена на параметры сортировки с учетом регистра, вам нужно заставить использовать нечувствительный к регистру:

SELECT balance FROM people WHERE email = '[email protected]'
  COLLATE SQL_Latin1_General_CP1_CI_AS 

Я нашел другое решение в другом месте; то есть использовать

upper(@yourString)

но все здесь говорят, что в SQL Server это не имеет значения, потому что он все равно игнорирует case? Я уверен, что наша база данных чувствительна к регистру.

нет, только с помощью LIKE не будет работать. LIKE ищет значения, соответствующие именно вашему заданному шаблону. В данном случае LIKE нашел бы только текст "sOmeVal", а не "someval".

практическое решение использует . LCASE('sOmeVal') получает строчную строку вашего текста: 'someval'. Если вы используете эту функцию для обеих сторон вашего сравнения, это работает:

SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')

оператор сравнивает две строчные строки, так что ваш "sOmeVal" будет соответствовать всем другим обозначениям "someval" (например, "Someval", "sOMEVAl" и т. д.).

вы можете заставить регистр чувствительным, приведение к varbinary, как это:

SELECT * FROM myTable 
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal')

в какой базе данных вы находитесь? В MS SQL Server это параметр для всей базы данных, или вы можете использовать его для каждого запроса с помощью ключевого слова COLLATE.

Comments

    Ничего не найдено.