Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Заобиколно решение за регулярен израз на SQL Server в T-SQL?

За съжаление, няма да можете да преместите вашата CLR функция(и) в SQL Azure. Ще трябва или да използвате нормалните низови функции (PATINDEX, CHARINDEX, LIKE и т.н.) или да извършите тези операции извън базата данни.

РЕДАКТИРАНЕ Добавяне на информация за примерите, добавени към въпроса.

Имейл адрес

Това винаги е противоречиво, защото хората не са съгласни коя версия на RFC искат да поддържат. Оригиналът например не поддържаше апострофи (или поне хората твърдят, че не поддържаше - не съм го изровил от архивите и не съм го чел сам, разбира се) и трябва да се разширява доста често за нови TLD (веднъж за 4-буквени TLD като .info, след това отново за 6-буквени TLD като .museum). Често съм чувал доста информирани хора да твърдят, че перфектната валидация на имейл е невъзможна, и тъй като преди това съм работил за доставчик на услуги за електронна поща, мога да ви кажа, че това беше постоянно движеща се цел. Но за най-простите подходи вижте въпроса TSQL валидиране на имейл (без регулярен израз ) .

Една цифрова цифра

Вероятно най-лесният от групата:

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

Номера на кредитни карти

Ако приемем, че махнете тирета и интервали, което трябва да направите във всеки случай. Имайте предвид, че това не е действителна проверка на алгоритъма за номера на кредитната карта, за да се гарантира, че самият номер е действително валиден, а само че отговаря на общия формат (AmEx =15 цифри, започващи с 3, останалите са 16 цифри - Visa започва с 4, MasterCard започва с 5, Discover започва с 6 и мисля, че има един, който започва със 7 (макар че това може да са само карти за подарък от някакъв вид)):

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

Ако искате да бъдете малко по-прецизни с цената на дълготрайност, можете да кажете:

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

Телефонни номера в САЩ

Отново, ако приемем, че първо ще премахнете скобите, тиретата и интервалите. Сигурен съм, че регионалния код на САЩ не може да започва с 1; ако има други правила, не съм запознат с тях.

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

-----

Няма да продължавам по-нататък, защото много от другите изрази, които сте дефинирали, могат да бъдат екстраполирани от горното. Надяваме се, че това ви дава начало. Трябва да можете да търсите в Google някои от другите, за да видите как други хора са репликирали моделите с T-SQL. Някои от тях (като дни от седмицата) вероятно могат просто да бъдат проверени спрямо таблица - изглежда прекалено много да се прави съпоставяне на модел на инвазия за набор от 7 възможни стойности. По същия начин със списък от 1000 числа или години, това са неща, които ще бъдат много по-лесни (и вероятно по-ефективни) за проверка дали числовата стойност е в таблица, вместо да я конвертирате в низ и да видите дали съответства на някакъв модел.

Отново ще заявя, че голяма част от това ще бъде много по-добре, ако можете да почистите и валидирате данните, преди да попаднат в базата данни на първо място. Трябва да се стремите да правите това, когато е възможно, защото без CLR просто не можете да правите мощен RegEx в 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. Вмъкнете всички стойности на таблица в друга таблица в SQL

  2. използвайки променлива на таблица с sp_executesql

  3. Visual Studio 2012 - Съветникът за публикуване на бази данни е прекратен?

  4. NOT IN срещу NOT EXISTS

  5. Как да коригирате грешката „функцията datediff доведе до преливане“ в SQL Server