UPPER () и LOWER () не требуются? - PullRequest
       42

UPPER () и LOWER () не требуются?

4 голосов
/ 03 февраля 2012

Некоторое время я думал, что для правильной оценки критериев WHERE мне необходимо учитывать чувствительность к регистру. Я бы использовал UPPER() и LOWER(), когда случай не имеет значения. Однако я обнаружил, что приведенные ниже запросы дают тот же результат.

SELECT * FROM ATable WHERE UPPER(part) = 'SOMEPARTNAME'
SELECT * FROM ATable WHERE part        = 'SOMEPARTNAME'
SELECT * FROM ATable WHERE part        = 'somepartname'

Сравнение строк с учетом регистра SQL объясняет использование сортировок с учетом регистра. Это единственный способ повысить чувствительность к регистру? Кроме того, если бы у вас было сопоставление без учета регистра, когда UPPER() и LOWER() были бы необходимы?

Спасибо за помощь.

Ответы [ 2 ]

5 голосов
/ 03 февраля 2012

Общее значение SQL Server по умолчанию для сортировки без учета регистра означает, что UPPER() и LOWER() не требуются при сравнении строк.

Фактически такое выражение, как

SELECT * FROM Table WHERE UPPER(part) = 'SOMEPARTNAME' 

также не может быть sargable, то есть не будет использовать доступные индексы из-за функции, примененной к столбцу part в левой части сравнения.

0 голосов
/ 03 февраля 2012

этот запрос ниже производит CASE SENSITIVE поиск:

SELECT Column1
FROM Table1
WHERE Column1 COLLATE Latin1_General_CS_AS = 'casesearch'

UPPER() и LOWER() являются только функциями для изменения регистра буквы, поэтому, если вы сортируете без учета регистра, они используются толькопосле SELECT Ключевое слово:

SELECT UPPER('qwerty'), LOWER('Dog')

returns
QWERTY, dog
...