sql >> Databáze >  >> RDS >> Sqlserver

Řešení regulárních výrazů serveru SQL Server v T-SQL?

Bohužel nebudete moci přesunout své funkce CLR do SQL Azure. Budete muset buď použít normální řetězcové funkce (PATINDEX, CHARINDEX, LIKE atd.), nebo tyto operace provádět mimo databázi.

UPRAVIT Přidání některých informací pro příklady přidané k otázce.

E-mailová adresa

Toto je vždy kontroverzní, protože lidé nesouhlasí s tím, kterou verzi RFC chtějí podporovat. Originál nepodporoval například apostrofy (nebo alespoň lidé trvají na tom, že ne - sám jsem to samozřejmě nevyhrabal z archivů a nečetl) a musí se poměrně často rozšiřovat o nové TLD (jednou pro 4písmenné TLD jako .info, poté znovu pro 6písmenné TLD jako .museum). Často jsem slýchal, že docela znalí lidé tvrdí, že dokonalé ověření e-mailu je nemožné, a jelikož jsem dříve pracoval pro poskytovatele e-mailových služeb, mohu vám říci, že to byl neustále se pohybující cíl. Ale pro nejjednodušší přístupy se podívejte na otázku TSQL Email Validation (bez regulárního výrazu ) .

Jedna číslice

Pravděpodobně ten nejjednodušší z celé skupiny:

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

Čísla kreditních karet

Za předpokladu, že odstraníte pomlčky a mezery, což byste měli udělat v každém případě. Všimněte si, že toto není skutečná kontrola algoritmu čísla kreditní karty, aby bylo zajištěno, že samotné číslo je skutečně platné, pouze zda odpovídá obecnému formátu (AmEx =15 číslic začínajících 3, zbytek je 16 číslic – Visa začíná 4, MasterCard začíná 5, Discover začíná 6 a myslím, že existuje jedna, která začíná 7 (i když to mohou být jen dárkové karty nějakého druhu)):

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

Pokud chcete být trochu přesnější za cenu zdlouhavosti, můžete říct:

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

Telefonní čísla v USA

Opět za předpokladu, že nejprve odstraníte závorky, pomlčky a mezery. Je docela jisté, že kód oblasti USA nemůže začínat 1; pokud existují jiná pravidla, neznám je.

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

-----

Nebudu zacházet dále, protože mnoho dalších výrazů, které jste definovali, lze extrapolovat z výše uvedeného. Doufám, že vám to dá začátek. Měli byste být schopni Google pro některé z ostatních, abyste viděli, jak jiní lidé replikovali vzory pomocí T-SQL. Některé z nich (jako dny v týdnu) lze pravděpodobně jen zkontrolovat podle tabulky - zdá se být přehnané provádět porovnávání vzorů invaze pro sadu 7 možných hodnot. Podobně se seznamem 1000 čísel nebo let budou tyto věci mnohem jednodušší (a pravděpodobně efektivnější) zkontrolovat, zda je číselná hodnota v tabulce, než ji převést na řetězec a zjistit, zda odpovídá nějakému vzoru.

Znovu uvedu, že mnohé z toho bude mnohem lepší, pokud dokážete vyčistit a ověřit data předtím, než se dostanou do databáze. Měli byste se o to snažit všude, kde je to možné, protože bez CLR prostě nemůžete dělat výkonný RegEx v SQL Serveru.



  1. Nelze se připojit k serveru MySQL na '127.0.0.1' (10061) (2003)

  2. WhoIsActive Runner

  3. jak echo speciální znaky jako åäö s utf8

  4. Jak použít if existuje-pokud neexistuje v PL/SQL?