Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Problemumgehung für reguläre Ausdrücke von SQL Server in T-SQL?

Leider können Sie Ihre CLR-Funktion(en) nicht nach SQL Azure verschieben. Sie müssen entweder die normalen Zeichenfolgenfunktionen (PATINDEX, CHARINDEX, LIKE usw.) verwenden oder diese Operationen außerhalb der Datenbank ausführen.

BEARBEITEN Hinzufügen einiger Informationen für die zur Frage hinzugefügten Beispiele.

E-Mail-Adresse

Dieser ist immer umstritten, weil die Leute sich nicht einig sind, welche Version des RFC sie unterstützen wollen. Das Original hat zum Beispiel keine Apostrophe unterstützt (oder zumindest behaupten die Leute, dass es das nicht getan hat - ich habe es nicht aus den Archiven ausgegraben und es selbst gelesen, zugegeben), und es muss ziemlich oft für neue erweitert werden TLDs (einmal für 4-Buchstaben-TLDs wie .info, dann noch einmal für 6-Buchstaben-TLDs wie .museum). Ich habe oft ziemlich sachkundige Leute sagen hören, dass eine perfekte E-Mail-Validierung unmöglich ist, und nachdem ich zuvor für einen E-Mail-Dienstleister gearbeitet habe, kann ich Ihnen sagen, dass dies ein ständig wechselndes Ziel war. Aber für die einfachsten Ansätze siehe die Frage TSQL Email Validation (ohne regex ) .

Eine Ziffer

Wahrscheinlich das einfachste von allen:

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

Kreditkartennummern

Vorausgesetzt, Sie entfernen Bindestriche und Leerzeichen, was Sie auf jeden Fall tun sollten. Beachten Sie, dass dies keine tatsächliche Überprüfung des Kreditkartennummernalgorithmus ist, um sicherzustellen, dass die Nummer selbst tatsächlich gültig ist, sondern nur, dass sie dem allgemeinen Format entspricht (AmEx =15 Ziffern beginnend mit einer 3, der Rest sind 16 Ziffern - Visa beginnt mit einer 4, MasterCard beginnt mit einer 5, Discover beginnt mit 6 und ich glaube, es gibt eine, die mit einer 7 beginnt (obwohl das möglicherweise nur eine Art Geschenkkarte ist):

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

Wenn Sie es auf Kosten der Langatmigkeit etwas präziser machen möchten, können Sie sagen:

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-Telefonnummern

Nehmen wir wieder an, Sie entfernen zuerst Klammern, Bindestriche und Leerzeichen. Ziemlich sicher, dass eine US-Vorwahl nicht mit einer 1 beginnen kann; falls es andere Regeln gibt, sind sie mir nicht bekannt.

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

-----

Ich werde nicht weiter darauf eingehen, da viele der anderen Ausdrücke, die Sie definiert haben, aus dem oben Gesagten extrapoliert werden können. Hoffentlich gibt Ihnen das einen Anfang. Sie sollten in der Lage sein, für einige der anderen zu googeln, um zu sehen, wie andere Personen die Muster mit T-SQL repliziert haben. Einige von ihnen (wie die Wochentage) können wahrscheinlich nur anhand einer Tabelle überprüft werden - scheint übertrieben zu sein, einen invasiven Musterabgleich für einen Satz von 7 möglichen Werten durchzuführen. Ähnlich wie bei einer Liste von 1000 Zahlen oder Jahren sind dies Dinge, die viel einfacher (und wahrscheinlich effizienter) zu überprüfen sind, ob sich der numerische Wert in einer Tabelle befindet, anstatt ihn in eine Zeichenfolge umzuwandeln und zu sehen, ob er mit einem Muster übereinstimmt.

Ich sage noch einmal, dass vieles davon viel besser ist, wenn Sie die Daten bereinigen und validieren können, bevor sie überhaupt in die Datenbank gelangen. Sie sollten sich bemühen, dies nach Möglichkeit zu tun, denn ohne CLR können Sie innerhalb von SQL Server keine leistungsstarken RegEx ausführen.