Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Solução alternativa de expressão regular do SQL Server em T-SQL?


Infelizmente, você não poderá mover suas funções CLR para o SQL Azure. Você precisará usar as funções normais de string (PATINDEX, CHARINDEX, LIKE e assim por diante) ou executar essas operações fora do banco de dados.

EDITAR Adicionando algumas informações para os exemplos adicionados à pergunta.

Endereço de e-mail

Este é sempre controverso porque as pessoas discordam sobre qual versão da RFC elas querem apoiar. O original não suportava apóstrofos, por exemplo (ou pelo menos as pessoas insistem que não suportava - eu não o desenterrei dos arquivos e li sozinho, admito), e ele precisa ser expandido com bastante frequência para novos TLDs (uma vez para TLDs de 4 letras como .info, depois novamente para TLDs de 6 letras como .museum). Muitas vezes ouvi pessoas bem informadas afirmarem que a validação perfeita de e-mail é impossível e, tendo trabalhado anteriormente para um provedor de serviços de e-mail, posso dizer que era um alvo em constante movimento. Mas para as abordagens mais simples, veja a pergunta TSQL Email Validation (sem regex ) .

Um dígito numérico

Provavelmente o mais fácil do grupo:
WHERE @s LIKE '[0-9]';

Números de cartão de crédito

Supondo que você remova traços e espaços, o que você deve fazer em qualquer caso. Observe que esta não é uma verificação real do algoritmo do número do cartão de crédito para garantir que o número em si seja realmente válido, apenas que está de acordo com o formato geral (AmEx =15 dígitos começando com 3, o resto são 16 dígitos - Visa começa com 4, MasterCard começa com 5, Discover começa com 6 e acho que há um que começa com 7 (embora possam ser apenas cartões-presente de algum tipo)):
WHERE @s + ' ' LIKE '[3-7]'+ REPLICATE('[0-9]', 14) + '[0-9 ]';

Se você quiser ser um pouco mais preciso ao custo de ser prolixo, você pode dizer:
WHERE (LEN(@s) = 15 AND @s LIKE '3'     + REPLICATE('[0-9]', 14))
   OR (LEN(@s) = 16 AND @s LIKE '[4-7]' + REPLICATE('[0-9]', 15));

Números de telefone dos EUA

Novamente, supondo que você irá remover parênteses, traços e espaços primeiro. Tenho certeza de que um código de área dos EUA não pode começar com 1; se existem outras regras, eu não estou ciente delas.
WHERE @s LIKE '[2-9]' + REPLICATE('[0-9]', 9);

-----

Não vou mais longe, porque muitas das outras expressões que você definiu podem ser extrapoladas do que foi dito acima. Espero que isso lhe dê um começo. Você deve ser capaz de pesquisar no Google alguns dos outros para ver como outras pessoas replicaram os padrões com o T-SQL. Alguns deles (como dias da semana) provavelmente podem ser verificados em uma tabela - parece um exagero fazer uma correspondência de padrão invasiva para um conjunto de 7 valores possíveis. Da mesma forma com uma lista de 1000 números ou anos, essas são coisas que serão muito mais fáceis (e provavelmente mais eficientes) verificar se o valor numérico está em uma tabela em vez de convertê-lo em uma string e ver se ele corresponde a algum padrão.

Eu direi novamente que muito disso será muito melhor se você puder limpar e validar os dados antes que eles entrem no banco de dados em primeiro lugar. Você deve se esforçar para fazer isso sempre que possível, porque sem CLR, você simplesmente não pode fazer RegEx poderoso dentro do SQL Server.