#sql #sql-server
#sql #sql-server
Вопрос:
Как написать имя SQL для поиска, начинающееся с a до z, с учетом регистра?
Мое текущее решение:
select *
from HR.Employees
where name collate sql_latin1_general_cp1_cs_as like '[abcdefghijklmnopqrstuvwxyz]%';
Есть решение получше?
Комментарии:
1. То есть вы хотите возвращать только тех пользователей, у которых нет ничего, кроме строчных букв? Как насчет пробелов или символов за пределами этих 26?
2. @Jingwei что означает начало в вашем вопросе?
3. это означает первую букву
4. @Jingwei итак, если 2-я буква в верхнем регистре, вы хотите, чтобы она была возвращена или нет?
5. Да, я хочу это.
Ответ №1:
Вы можете проверить ascii-код первого символа:
select *
from HR.Employees
where ascii(substring(name, 1, 1)) between ascii('a') and ascii('z')
вы также могли бы использовать left(name, 1)
функцию вместо substring(name, 1, 1)
.
Ответ №2:
Я не верю, что вам нужно первое COLLATE
, но вот вариант, который должен дать вам то, что вам нужно. Важная часть заключается в том, чтобы сделать строку сравнения чувствительной к регистру.
SELECT *
FROM HR.Employees
WHERE name LIKE '[a-z]%' COLLATE Latin1_General_BIN;
Комментарии:
1. С какой стати кому-то опускать это? Это лучший способ справиться с этим.
2. Вероятно, потому, что они хотят, чтобы их решение было признано лучшим. Просто догадываюсь.
3. Возможно, или они не понимают, почему вы использовали двоичную сортировку вместо чего-то другого, потому что они не знают, что она чувствительна к регистру.
4. @SeanLange Я не уменьшал голос, но повторная сортировка столбца не улучшает производительность.
5. @GSerg да. Кажется, что если чувствительность к регистру важна, то лучшим решением было бы использовать правильные параметры сортировки в столбце (которые, конечно, могут быть унаследованы из таблицы или даже базы данных).