Использование SELECT для получения в SQL Server только полей с буквенно-цифровыми данными (и определенными знаками препинания)
Я пытаюсь отфильтровать некоторые данные сервера SQL и требовать результаты с соблюдением следующих условий:
- где поле имеет буквенно-цифровые символы, без учета регистра
- где поле имеет определенную пунктуацию (апостроф и дефис)
- где поле не имеет пробелов
Есть ли эффективный способ сделать это с помощью CHAR в SQL Server или у кого-нибудь есть лучшее решение?
2 ответа
При этом используется двойной минус для фильтрации только по желаемому диапазону символов
Любой символ за пределами желаемого диапазона дает истину от LIKE. Если строка состоит только из символа в желаемом диапазоне, LIKE выдает false. Тогда другого НЕ
WHERE
SomeCol NOT LIKE '%[^a-z0-9-'']%'
Примечание: здесь я использовал одинарную кавычку
По умолчанию SQL Server нечувствителен к регистру. Добавьте предложение COLLATE, если необходимо
SomeCol COLLATE Latin1_General_CI_AS NOT LIKE '%[^a-z0-9-']%'
или изменить диапазон
SomeCol NOT LIKE '%[^a-zA-Z0-9-']%'
или, если вы хотите включить ä = a
SomeCol COLLATE Latin1_General_CI_AI NOT LIKE '%[^a-z0-9-']%'
RegExps согласно @ak, но с использованием PATINDEX и тестированием с помощью временной таблицы.
--Tmp table
DECLARE @regexpTbl TABLE([accountNo] nvarchar(200));
--Test rows
insert into @regexpTbl (accountNo) values ('AAA')
insert into @regexpTbl (accountNo) values ('1111')
insert into @regexpTbl (accountNo) values ('AA11ASD')
insert into @regexpTbl (accountNo) values ('AA1-1ASD')
insert into @regexpTbl (accountNo) values ('$$$$$$$')
insert into @regexpTbl (accountNo) values ('$$$AAA AA$$$$')
insert into @regexpTbl (accountNo) values ('A')
insert into @regexpTbl (accountNo) values ('$')
--Everything
SELECT accountNo as [1] FROM @regexpTbl
--does not have non-alphnumeric
--i.e has alphanumeric only
SELECT accountNo as [2] FROM @regexpTbl WHERE accountNo NOT LIKE '%[^a-z0-9-'' ]%'
--has at least one alphanumeric
SELECT accountNo as [3] FROM @regexpTbl WHERE accountNo LIKE '%[a-Z]%'
--has non-alphanumeric or space
SELECT accountNo as [5] FROM @regexpTbl WHERE PATINDEX('%[^a-zA-Z0-9 ]%',accountNo)>0
--does not have non-alphnumeric
--i.e has alphanumeric only
SELECT accountNo as [6] FROM @regexpTbl WHERE PATINDEX('%[^a-zA-Z0-9]%',accountNo)<=0