sql >> データベース >  >> RDS >> Sqlserver

T-SQLでのSQLServer正規表現の回避策?

    残念ながら、CLR関数をSQLAzureに移動することはできません。通常の文字列関数(PATINDEX、CHARINDEX、LIKEなど)を使用するか、データベースの外部でこれらの操作を実行する必要があります。

    編集 質問に追加された例の情報を追加します。

    メールアドレス

    人々はRFCのどのバージョンをサポートしたいかについて意見が分かれているため、これは常に物議を醸しています。たとえば、オリジナルはアポストロフィをサポートしていませんでした(または、少なくとも人々はサポートしていなかったと主張しています-確かに、アーカイブから掘り起こして自分で読んだことはありません)。 TLD(.infoのような4文字のTLDの場合は1回、.museumのような6文字のTLDの場合はもう一度)。非常に知識のある人が、完全な電子メール検証は不可能であると言うのをよく耳にします。以前は電子メールサービスプロバイダーで働いていたので、それは絶えず動いているターゲットだったと言えます。ただし、最も簡単なアプローチについては、質問 TSQLメール検証(正規表現なし)を参照してください。 )

    1桁の数字

    おそらく最も簡単なもの:

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

    クレジットカード番号

    ダッシュとスペースを削除すると仮定します。これは、どのような場合でも実行する必要があります。これは、番号自体が実際に有効であることを確認するためのクレジットカード番号アルゴリズムの実際のチェックではなく、一般的な形式(AmEx =3から始まる15桁、残りは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);
    

    -----

    あなたが定義した他の多くの式は上記から推定できるので、これ以上先に進むつもりはありません。うまくいけば、これはあなたにスタートを与えるでしょう。他の人がT-SQLでパターンをどのように複製したかを確認するために、他の人のためにGoogleにアクセスできるはずです。それらのいくつか(曜日など)は、おそらくテーブルに対してチェックすることができます-7つの可能な値のセットに対して侵入パターンマッチングを行うのはやり過ぎのようです。同様に、1000の数値または年のリストの場合、これらは、数値を文字列に変換して何らかのパターンに一致するかどうかを確認するよりも、数値がテーブルにあるかどうかを確認する方がはるかに簡単(そしておそらくより効率的)です。

    そもそもデータベースに入る前にデータをクレンジングして検証できれば、これの多くははるかに優れていることをもう一度述べておきます。 CLRがないと、SQL Server内で強力な正規表現を実行できないため、可能な限りこれを実行するように努める必要があります。



    1. Oracle:「即時実行」とはどういう意味ですか?

    2. MYSQL最後の5つの異なるレコードに対して5つのレコードを選択します

    3. Postgresの複数の関連テーブルからデータを取得するにはどうすればよいですか?

    4. C#Oracleマネージド接続でのKerberos