Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Obejście wyrażeń regularnych programu SQL Server w języku T-SQL?

Niestety nie będzie można przenieść funkcji CLR do SQL Azure. Będziesz musiał albo użyć normalnych funkcji ciągów (PATINDEX, CHARINDEX, LIKE itd.) albo wykonać te operacje poza bazą danych.

EDYTUJ Dodanie informacji do przykładów dodanych do pytania.

Adres e-mail

Ten jest zawsze kontrowersyjny, ponieważ ludzie nie zgadzają się co do tego, którą wersję RFC chcą wspierać. Oryginał na przykład nie zawierał apostrofów (a przynajmniej ludzie twierdzą, że tak nie było – nie wygrzebałem go z archiwów i sam go nie przeczytałem) i trzeba go dość często rozbudowywać o nowe TLD (raz dla 4-literowych domen TLD, takich jak .info, a następnie dla 6-literowych domen TLD, takich jak .museum). Często słyszę, jak całkiem znający się na rzeczy ludzie twierdzą, że doskonała walidacja poczty e-mail jest niemożliwa, a pracując wcześniej dla dostawcy usług pocztowych, mogę powiedzieć, że był to stale zmieniający się cel. Ale najprostsze podejścia znajdziesz w pytaniu TSQL Email Validation (bez regex ) .

Jedna cyfra

Prawdopodobnie najłatwiejszy z tej grupy:

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

Numery kart kredytowych

Zakładając, że usuniesz myślniki i spacje, co powinieneś zrobić w każdym przypadku. Zauważ, że nie jest to faktyczne sprawdzenie algorytmu numeru karty kredytowej, aby upewnić się, że sam numer jest rzeczywiście ważny, tylko że jest zgodny z ogólnym formatem (AmEx =15 cyfr zaczynających się od 3, reszta to 16 cyfr - Visa zaczyna się od 4, MasterCard zaczyna się od 5, Discover zaczyna się od 6 i myślę, że jest taki, który zaczyna się od 7 (chociaż może to być tylko pewnego rodzaju karty podarunkowe)):

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

Jeśli chcesz być bardziej precyzyjny kosztem rozwlekłości, możesz powiedzieć:

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

Numery telefonów w USA

Ponownie, zakładając, że najpierw usuniesz nawiasy, myślniki i spacje. Jestem prawie pewien, że numer kierunkowy w USA nie może zaczynać się od 1; jeśli istnieją inne zasady, nie jestem ich świadomy.

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

-----

Nie zamierzam iść dalej, ponieważ wiele innych zdefiniowanych wyrażeń można ekstrapolować z powyższego. Mam nadzieję, że to daje początek. Powinieneś być w stanie Google dla niektórych innych, aby zobaczyć, jak inni ludzie replikowali wzorce za pomocą T-SQL. Niektóre z nich (np. dni tygodnia) można prawdopodobnie po prostu porównać z tabelą - wydaje się przesadą, aby wykonać dopasowanie wzorca inwazji dla zestawu 7 możliwych wartości. Podobnie z listą 1000 liczb lub lat, są to rzeczy, które znacznie łatwiej (i prawdopodobnie wydajniej) sprawdzić, czy wartość liczbowa znajduje się w tabeli, niż zamienić ją na ciąg i sprawdzić, czy pasuje do jakiegoś wzorca.

Powtórzę jeszcze raz, że wiele z tego będzie znacznie lepszych, jeśli będziesz w stanie wyczyścić i zweryfikować dane, zanim trafią one do bazy danych. Powinieneś dążyć do tego, gdy tylko jest to możliwe, ponieważ bez CLR po prostu nie możesz zrobić potężnego RegEx wewnątrz SQL Server.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest najlepszy sposób tworzenia i wypełniania tabeli liczb?

  2. Co to jest system zarządzania bazą danych i relacyjnymi bazami danych (RDBMS)

  3. Jak wstawić wyniki procedury składowanej do tabeli tymczasowej w SQL Server

  4. Różnica między sys.views, sys.system_views i sys.all_views w programie SQL Server

  5. Jak wyłączyć CDC w zestawie tabel LUB wyłączyć we wszystkich tabelach w bazie danych w programie SQL Server — samouczek dotyczący programu SQL Server