sql >> Database >  >> RDS >> Sqlserver

Tijdelijke oplossing voor SQL Server-expressie in T-SQL?

Helaas kunt u uw CLR-functie(s) niet naar SQL Azure verplaatsen. U moet ofwel de normale tekenreeksfuncties gebruiken (PATINDEX, CHARINDEX, LIKE, enzovoort) of deze bewerkingen buiten de database uitvoeren.

BEWERKEN Wat informatie toevoegen voor de voorbeelden die aan de vraag zijn toegevoegd.

E-mailadres

Deze is altijd controversieel omdat mensen het oneens zijn over welke versie van de RFC ze willen ondersteunen. Het origineel ondersteunde bijvoorbeeld geen apostrofs (of in ieder geval staan ​​mensen erop dat dat niet het geval was - ik heb het weliswaar niet uit de archieven opgegraven en zelf gelezen), en het moet vrij vaak worden uitgebreid voor nieuwe TLD's (eenmaal voor 4-letterige TLD's zoals .info, dan weer voor 6-letterige TLD's zoals .museum). Ik heb mensen met veel kennis vaak horen zeggen dat perfecte e-mailvalidatie onmogelijk is, en omdat ik eerder voor een e-mailserviceprovider heb gewerkt, kan ik je vertellen dat het een constant bewegend doelwit was. Maar voor de eenvoudigste benaderingen, zie de vraag TSQL Email Validation (zonder regex ) .

Eén numeriek cijfer

Waarschijnlijk de gemakkelijkste van het stel:

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

Creditcardnummers

Ervan uitgaande dat u streepjes en spaties verwijdert, wat u in ieder geval zou moeten doen. Merk op dat dit geen daadwerkelijke controle is van het creditcardnummeralgoritme om er zeker van te zijn dat het nummer zelf echt geldig is, alleen dat het voldoet aan het algemene formaat (AmEx =15 cijfers beginnend met een 3, de rest zijn 16 cijfers - Visa begint met een 4, MasterCard begint met een 5, Discover begint met 6 en ik denk dat er een is die begint met een 7 (hoewel dat misschien gewoon cadeaubonnen zijn)):

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

Als je wat preciezer wilt zijn ten koste van langdradig zijn, kun je zeggen:

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

VS-telefoonnummers

Nogmaals, ervan uitgaande dat je eerst haakjes, streepjes en spaties gaat verwijderen. Vrij zeker dat een Amerikaans netnummer niet met een 1 kan beginnen; als er andere regels zijn, weet ik ze niet.

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

-----

Ik ga niet verder gaan, omdat veel van de andere uitdrukkingen die je hebt gedefinieerd, kunnen worden geëxtrapoleerd uit het bovenstaande. Hopelijk geeft dit je een begin. Je zou voor sommige van de anderen moeten kunnen Googlen om te zien hoe andere mensen de patronen hebben gerepliceerd met T-SQL. Sommigen van hen (zoals dagen van de week) kunnen waarschijnlijk gewoon worden gecontroleerd aan de hand van een tabel - lijkt overkill om een ​​invasiepatroon te matchen voor een set van 7 mogelijke waarden. Evenzo met een lijst van 1000 getallen of jaren, zijn dit dingen die veel gemakkelijker (en waarschijnlijk efficiënter) zullen zijn om te controleren of de numerieke waarde in een tabel staat in plaats van deze naar een string te converteren en te kijken of deze overeenkomt met een bepaald patroon.

Ik zeg nogmaals dat veel hiervan veel beter zal zijn als je de gegevens kunt opschonen en valideren voordat ze in de database terechtkomen. U moet ernaar streven dit waar mogelijk te doen, want zonder CLR kunt u gewoon geen krachtige RegEx binnen SQL Server uitvoeren.



  1. Laad een csv-bestand met specifieke kolommen met PDO

  2. Hoe maak ik een nieuwe webpagina op basis van een door een gebruiker ingediend database-item?

  3. Hoe PostgreSQL-database profileren?

  4. Kun je een index maken in de CREATE TABLE-definitie?