Тест для верхнего случая - 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