Использование 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 
Другие вопросы по тегам