sql >> Databasteknik >  >> RDS >> Sqlserver

Lösning för SQL Server Regular Expression i T-SQL?

Tyvärr kommer du inte att kunna flytta dina CLR-funktioner till SQL Azure. Du måste antingen använda de vanliga strängfunktionerna (PATINDEX, CHARINDEX, LIKE och så vidare) eller utföra dessa operationer utanför databasen.

REDIGERA Lägger till lite information för de exempel som lagts till i frågan.

E-postadress

Den här är alltid kontroversiell eftersom folk inte är överens om vilken version av RFC de vill stödja. Originalet stödde till exempel inte apostrof (eller åtminstone insisterar folk på att det inte gjorde det - jag har inte grävt fram det från arkiven och läst det själv, visserligen), och det måste utökas ganska ofta för nya TLD:er (en gång för 4-bokstäver TLD som .info, sedan igen för 6-bokstavs TLD som .museum). Jag har ofta hört ganska kunniga människor säga att perfekt e-postvalidering är omöjligt, och efter att ha arbetat tidigare för en e-postleverantör kan jag berätta att det var ett ständigt rörligt mål. Men för de enklaste tillvägagångssätten, se frågan TSQL-e-postvalidering (utan regex) ) .

En numerisk siffra

Förmodligen den enklaste av gänget:

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

Kreditkortsnummer

Förutsatt att du tar bort streck och mellanslag, vilket du bör göra i alla fall. Observera att detta inte är en faktisk kontroll av kreditkortsnummeralgoritmen för att säkerställa att själva numret faktiskt är giltigt, bara att det överensstämmer med det allmänna formatet (AmEx =15 siffror som börjar med en 3, resten är 16 siffror - Visa börjar med en 4, MasterCard börjar med en 5, Discover börjar med 6 och jag tror att det finns en som börjar med en 7 (även om det bara kan vara presentkort av något slag)):

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

Om du vill vara lite mer exakt till priset av att vara långrandig kan du säga:

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

Telefonnummer i USA

Återigen, förutsatt att du först ska ta bort parenteser, bindestreck och mellanslag. Ganska säker på att ett riktnummer i USA inte kan börja med 1; om det finns andra regler känner jag inte till dem.

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

-----

Jag tänker inte gå längre, eftersom många av de andra uttrycken du har definierat kan extrapoleras från ovanstående. Förhoppningsvis ger detta dig en start. Du bör kunna googla efter några av de andra för att se hur andra människor har replikerat mönstren med T-SQL. Vissa av dem (som veckodagar) kan förmodligen bara kontrolleras mot en tabell - verkar överdrivet att göra en invasionsmönstermatchning för en uppsättning av 7 möjliga värden. På samma sätt med en lista med 1000 siffror eller år, är det här saker som kommer att vara mycket enklare (och förmodligen effektivare) att kontrollera om det numeriska värdet finns i en tabell snarare än att konvertera det till en sträng och se om det matchar något mönster.

Jag ska återigen säga att mycket av detta kommer att bli mycket bättre om du kan rensa och validera data innan den kommer in i databasen i första hand. Du bör sträva efter att göra detta där det är möjligt, för utan CLR kan du helt enkelt inte göra kraftfulla RegEx i SQL Server.



  1. Hur implementerar man lång polling med socket.io?

  2. Undvik offert i HQL-fråga

  3. ORA-00979:inte ett GROUP BY-uttryck när jag kör min sql

  4. Installera MySQL på en VPS-server och ansluta från andra servrar