T-SQL Regex для номера социального страхования (SQL Server 2008 R2)
Мне нужно найти недействительные номера социального страхования в varchar
поле в таблице базы данных SQL Server 2008 (Действительные номера SSN определяются в формате ###-##-####
- не имеет значения, что это за цифры, если они находятся в этом паттерне "3-значный тире 2-значный тире 4-значный".
У меня есть рабочее регулярное выражение:
SELECT *
FROM mytable
WHERE ssn NOT LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]'
Это находит недействительные номера SSN в столбце, но я знаю (хорошо - я вполне уверен), что есть способ сократить это, чтобы указать, что предыдущий шаблон может иметь x итераций.
Я думал, что это будет работать:
'[0-9]{3}-[0-9]{2}-[0-9]{4}'
Но это не так.
Есть ли более короткое регулярное выражение, чем приведенное выше в select, или нет? Или, может быть, есть, но T-SQL/SQL Server 2008 не поддерживает его!?
2 ответа
Если вы планируете получить более короткий вариант выражения LIKE, ответ - нет.
В T-SQL вы можете использовать только следующие шаблоны в шаблоне:
%
- Любая строка из нуля или более символов.WHERE title LIKE '%computer%'
находит все названия книг со словомcomputer
в любом месте в названии книги._ (нижнее подчеркивание)
Любой отдельный персонаж.WHERE au_fname LIKE '_ean'
находит все четырехбуквенные имена, которые заканчиваются наean
(Дин, Шон и так далее).
[]
Любой отдельный символ в указанном диапазоне ([a-f]
) или установить ([abcdef]
).WHERE au_lname LIKE '[C-P]arsen'
находит фамилии автора, заканчивающиеся наarsen
и начиная с любого отдельного символа междуC
а такжеP
, напримерCarsen
,Larsen
,Karsen
, и так далее. При поиске по диапазону символы, включенные в диапазон, могут различаться в зависимости от правил сортировки.
[^]
Любой отдельный символ вне указанного диапазона ([^a-f]
) или установить ([^abcdef]
).
Так что ваши LIKE
Заявление уже является кратчайшим выражением. Ограничивающие квантификаторы не могут быть использованы (такие как {min,max}
), а не сокращенные классы, такие как \d
,
Если бы вы использовали MySQL, вы могли бы использовать более богатый набор утилит для регулярных выражений, но это не так.
Я предлагаю вам использовать другое решение, подобное этому:
-- Use `REPLICATE` if you really want to use a number to repeat
Declare @rgx nvarchar(max) = REPLICATE('#', 3) + '-' +
REPLICATE('#', 2) + '-' +
REPLICATE('#', 4);
-- or use your simple format string
Declare @rgx nvarchar(max) = '###-##-####';
-- then use this to get your final `LIKE` string.
Set @rgx = REPLACE(@rgx, '#', '[0-9]');
И вы также можете использовать что-то вроде '_'
для символов, затем замените его [A-Z]
и так далее.