Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Espressione regolare di SQL Server Soluzione alternativa in T-SQL?

Sfortunatamente, non sarai in grado di spostare le tue funzioni CLR in SQL Azure. Dovrai utilizzare le normali funzioni di stringa (PATINDEX, CHARINDEX, LIKE e così via) o eseguire queste operazioni al di fuori del database.

MODIFICA Aggiungendo alcune informazioni per gli esempi aggiunti alla domanda.

Indirizzo email

Questo è sempre controverso perché le persone non sono d'accordo su quale versione della RFC vogliono supportare. L'originale non supportava gli apostrofi, per esempio (o almeno la gente insiste sul fatto che non lo facesse - non l'ho tirato fuori dagli archivi e l'ho letto da solo, lo ammetto), e deve essere ampliato abbastanza spesso per nuovi TLD (una volta per TLD di 4 lettere come .info, poi di nuovo per TLD di 6 lettere come .museum). Ho sentito spesso persone abbastanza esperte affermare che una perfetta convalida della posta elettronica è impossibile e, avendo lavorato in precedenza per un fornitore di servizi di posta elettronica, posso dirti che era un obiettivo in costante movimento. Ma per gli approcci più semplici, vedere la domanda TSQL Email Validation (senza regex ) .

Una cifra numerica

Probabilmente il più semplice del gruppo:

WHERE @s LIKE '[0-9]';

Numeri di carta di credito

Supponendo di eliminare trattini e spazi, cosa che dovresti fare in ogni caso. Nota che questo non è un vero e proprio controllo dell'algoritmo del numero di carta di credito per garantire che il numero stesso sia effettivamente valido, solo che è conforme al formato generale (AmEx =15 cifre che iniziano con un 3, il resto sono 16 cifre - Visa inizia con un 4, MasterCard inizia con un 5, Discover inizia con 6 e penso che ce ne sia uno che inizia con un 7 (anche se potrebbero essere solo buoni regalo di qualche tipo)):

WHERE @s + ' ' LIKE '[3-7]'+ REPLICATE('[0-9]', 14) + '[0-9 ]';

Se vuoi essere un po' più preciso a costo di essere prolisso, puoi dire:

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));

Numeri di telefono USA

Di nuovo, supponendo che prima eliminerai parentesi, trattini e spazi. Abbastanza sicuro un prefisso degli Stati Uniti non può iniziare con un 1; se ci sono altre regole, non ne sono a conoscenza.

WHERE @s LIKE '[2-9]' + REPLICATE('[0-9]', 9);

-----

Non andrò oltre, perché molte delle altre espressioni che hai definito possono essere estrapolate da quelle sopra. Spero che questo ti dia un inizio. Dovresti essere in grado di cercare su Google per alcuni degli altri di vedere come altre persone hanno replicato i modelli con T-SQL. Alcuni di essi (come i giorni della settimana) possono probabilmente essere confrontati con una tabella:sembra eccessivo eseguire una corrispondenza del modello di invasione per un insieme di 7 valori possibili. Allo stesso modo, con un elenco di 1000 numeri o anni, queste sono cose che saranno molto più facili (e probabilmente più efficienti) per controllare se il valore numerico è in una tabella piuttosto che convertirlo in una stringa e vedere se corrisponde a qualche modello.

Dichiaro ancora una volta che molto di questo sarà molto meglio se puoi pulire e convalidare i dati prima che entrino nel database in primo luogo. Dovresti sforzarti di farlo ove possibile, perché senza CLR, semplicemente non puoi eseguire potenti RegEx all'interno di SQL Server.