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

SQL Server Regular Expression Workaround i T-SQL?

Desværre vil du ikke være i stand til at flytte dine CLR-funktioner til SQL Azure. Du skal enten bruge de normale strengfunktioner (PATINDEX, CHARINDEX, LIKE og så videre) eller udføre disse operationer uden for databasen.

REDIGER Tilføjelse af nogle oplysninger til eksemplerne tilføjet til spørgsmålet.

E-mailadresse

Denne er altid kontroversiel, fordi folk er uenige om, hvilken version af RFC de ønsker at støtte. Originalen understøttede f.eks. ikke apostrof (eller i det mindste insisterer folk på, at den ikke gjorde det - jeg har ganske vist ikke gravet den op fra arkiverne og læst den selv), og den skal udvides ret ofte for nye TLD'er (en gang for 4-bogstavs TLD'er som .info, så igen for 6-bogstavs TLD'er som .museum). Jeg har ofte hørt ganske vidende folk sige, at perfekt e-mail-validering er umulig, og efter at have arbejdet for en e-mail-tjenesteudbyder, kan jeg fortælle dig, at det var et konstant bevægeligt mål. Men for de enkleste tilgange, se spørgsmålet TSQL-e-mailvalidering (uden regulært udtryk) ) .

Et numerisk ciffer

Nok den nemmeste af flokken:

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

Kreditkortnumre

Forudsat at du fjerner streger og mellemrum, hvilket du under alle omstændigheder bør gøre. Bemærk, at dette ikke er en egentlig kontrol af kreditkortnummeralgoritmen for at sikre, at selve nummeret faktisk er gyldigt, bare at det er i overensstemmelse med det generelle format (AmEx =15 cifre starter med 3, resten er 16 cifre - Visa starter med 4, MasterCard starter med 5, Discover starter med 6, og jeg tror, ​​der er et, der starter med 7 (selvom det måske bare er gavekort af en slags)):

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

Hvis du vil være lidt mere præcis på bekostning af at være langhåret, kan du sige:

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

USA-telefonnumre

Igen, forudsat at du først skal fjerne parenteser, bindestreger og mellemrum. Temmelig sikker på, at et amerikansk områdenummer ikke kan starte med et 1; hvis der er andre regler, er jeg ikke bekendt med dem.

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

-----

Jeg vil ikke gå videre, for mange af de andre udtryk, du har defineret, kan ekstrapoleres fra ovenstående. Forhåbentlig giver dette dig en start. Du burde være i stand til at Google for nogle af de andre for at se, hvordan andre mennesker har replikeret mønstrene med T-SQL. Nogle af dem (som ugedage) kan sikkert bare tjekkes mod en tabel - virker overkill at lave en invasionsmønstermatchning for et sæt af 7 mulige værdier. På samme måde med en liste med 1000 tal eller år, er det ting, der vil være meget nemmere (og sandsynligvis mere effektivt) at kontrollere, om den numeriske værdi er i en tabel i stedet for at konvertere den til en streng og se, om den matcher et eller andet mønster.

Jeg vil igen slå fast, at meget af dette vil være meget bedre, hvis du kan rense og validere dataene, før de kommer ind i databasen i første omgang. Du bør stræbe efter at gøre dette, hvor det er muligt, for uden CLR kan du bare ikke lave kraftfulde RegEx inde i SQL Server.



  1. Et Performance Cheat Sheet til PostgreSQL

  2. Findes der en Go Mysql-driver, der understøtter flere sætninger inden for en enkelt streng?

  3. Søg i en hel tabel i mySQL efter en streng

  4. Hvordan definerer man en pl sql-funktion med dynamiske returtyper i Oracle?