Тест для верхнего случая - T-Sql
Все,
Как проверить, является ли указанный символ varchar или целая строка верхним регистром в T-Sql? В идеале я хотел бы написать функцию, чтобы проверить, является ли символ верхним регистром, а затем я могу применить это к универсальному varchar. Он должен возвращать false для не буквенных символов. Меня интересуют только символы английского языка.
Я работаю с T-sql в SQL Management Studio, и я попытался потянуть записи, начиная с строчной буквы из таблицы следующим образом:
select * from TABLE
where SUBSTRING(author,1,1) != LOWER(SUBSTRING(author,1,1))
Что возвращает 0 записей, но я знаю, что есть записи, начинающиеся с букв верхнего и нижнего регистра.
благодаря
EDIT: Поскольку и podiluska, и joachim-isaksoon успешно ответили на мой вопрос (оба метода работают для моих целей), кто-то подумает, какой из них будет наиболее эффективным методом для запроса таблицы с большим количеством записей для фильтрации записей с авторами, начинающимися с заглавной буквы или без нее?
Ответы
Ответ 1
Использование сопоставлений
например:
if ('a'='A' Collate Latin1_General_CI_AI)
print'same 1'
else
print 'different 1'
if ('a'='A' Collate Latin1_General_CS_AI)
print'same 2'
else
print 'different 2'
CS в имени сопоставления указывает на чувствительность к регистру (и CI, нечувствительный к регистру). AI/AS относится к чувствительности акцентов.
или в вашем примере
SUBSTRING(author,1,1) <> LOWER(SUBSTRING(author,1,1)) COLLATE Latin1_General_CS_AI
Ответ 2
Проверить, является ли ch верхним регистром, и является символом, который может быть преобразован между верхним и нижним регистром (т.е. Исключая несимвольные символы);
WHERE UNICODE(ch) <> UNICODE(LOWER(ch))
SQLfiddle для тестирования;
Ответ 3
что-то вроде
declare @v varchar(10) = 'ABC', @ret int = 0
select @ret = 1 where upper(@v)[email protected] COLLATE SQL_Latin1_General_CP1_CS_AS
select @ret