#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
метод: из-за сортировки без учета регистра, которая, вероятно, должна действовать.