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] и так далее.

Другие вопросы по тегам