SQL Server 2008: Как выбрать все строки, в которых поле содержит все заглавные буквы?

#sql #regex #sql-server-2008

#sql #регулярное выражение #sql-server-2008

Вопрос:

Вот о чем я думал, я знаю, что в этом поле первое слово всегда будет иметь длину не менее 2 символов.

 Select *  
From Table!
where SUBSTRING(Name, 1, 3) like '[A-Z]'
  

Однако, это возвращает не заглавные буквы, какие-либо идеи?

Комментарии:

1. Довольно уверен, что like это не чувствительно к регистру

2. Зависит от последовательности сортировки. Параметры сортировки по умолчанию не зависят от регистра, так что вы получите такое поведение, если только SQL Server, база данных или столбец не были определены с учетом регистра. Параметры сортировки. Чтобы обеспечить учет регистра, укажите параметры сортировки с учетом регистра: ...where not <some-column> like '%[^A-Z]%' collate SQL_Latin1_General_CP1_CS_AS . Применяются все обычные предостережения, касающиеся взаимодействия с последовательностью сортировки.

Ответ №1:

 Select ...
From MyTable
Where Name Not Like '%[^A-Z]%' Collate SQL_Latin1_General_CP1_CS_AS
  

Следует отметить, что это также исключит числа и символы за пределами A-Z. Если вы хотели включить нелатинские символы верхнего регистра, вам действительно нужно использовать Upper функцию вместе с Collate предикатом:

 Select ...
From MyTable
Where Name = Upper(Name) Collate SQL_Latin1_General_CP1_CS_AS
  

Тестовый скрипт:

 With TestData As
    (
    Select '012324' As Name
    Union All Select 'ABC'
    Union All Select 'abc'
    Union All Select 'aBc'
    Union All Select 'ABé'
    Union All Select 'ABÉ'
    )
Select *
From TestData
Where Name = UPPER(Name) Collate SQL_Latin1_General_CP1_CS_AS
  

Результаты:

 012324
ABC
ABÉ
  

Комментарии:

1. @Jai — В моих тестовых данных оба работают в соответствии со своими границами. Т.Е. использование Upper и предиката Collate возвращает только заголовки, написанные заглавными буквами.

2. @Jai — Я опубликовал тестовый скрипт для иллюстрации.

3. @Jai — Кстати, следует отметить, что вам не обязательно выбирать точно такую же сортировку, которую я сделал здесь. Это то, что вам нужно выбрать параметры сортировки с учетом регистра. В именовании CS означает «чувствительный к регистру». Вы можете использовать fn_helpcollations функцию для поиска подходящей сортировки с учетом регистра.

Ответ №2:

 CREATE TABLE #table1
(
x VARCHAR(32)
);

INSERT #table1 SELECT '123aaa';
INSERT #table1 SELECT 'foo';
INSERT #table1 SELECT 'BaR';
INSERT #table1 SELECT 'saM';
INSERT #table1 SELECT 'Sam';
INSERT #table1 SELECT 'SaM';
INSERT #table1 SELECT 'SAM';

SELECT * FROM #table1
WHERE CONVERT(VARBINARY(32), x) = CONVERT(VARBINARY(32), UPPER(x))

DROP TABLE #table1;
  

Вывод:

 x
SAM
  

Ответ №3:

Вам нужно будет добавить параметры сортировки к вашему запросу. Это хороший пример того, как это сделать.

Ответ №4:

Не могли бы вы просто сделать что-то вроде

 select * from Table!
where Name = upper(Name) 
  

Ответ №5:

Как насчет тестирования версии с заглавной буквы в сравнении с оригиналом:

 SELECT * FROM Table WHERE UPPER(Name) = Name
  

Редактировать: Как указано в комментариях, это не работает, если параметры сортировки не чувствительны к регистру (что, я думаю, по умолчанию). Ознакомьтесь с ответом Томаса.

Комментарии:

1. Не поможет по той же причине, по которой не сработал LIKE метод: из-за сортировки без учета регистра, которая, вероятно, должна действовать.