2011-12-06 2 views
0

セミコロンで区切られた電子メールドメインを含むテーブルがあります。LIKEを使用するのではなく、よりクリーンな実装

Domain 
------ 
gmail.com;googlemail.com 
hotmail.com;hotmail.co.uk;live.co.uk 

私は現在、以下のSQLを実行しています:

SELECT [Id] 
    FROM [DomainGroup] 
WHERE [Domain] LIKE '%' + (SELECT RIGHT('[email protected]', CHARINDEX('@', REVERSE('[email protected]')) - 1)) + '%' 

これが働いているが、私は多分PATINDEXを使用すると、パフォーマンスと読みやすさの両方から、より良いだろうと考えていました。電子メールアドレスは実際には変数ですが、達成しようとしていることを示すために入力しました。

+3

理由だけではなく、別のテーブルに列を正規化しませんか?あなたの現在のようなアプローチでは、あなたの実装には大したことではないかもしれないが、指摘する価値のある 'hotmail.com'を' neil @ hotmail.co'に受け入れると言うでしょう。 – Seph

答えて

0

私はLIKEPATINDEXのパフォーマンス上の利点は、特にあなたの場合には、インデックス付きの列内の個々の行に区切られた値を正規化することは何よりもパフォーマンス向上の多くを与えることを考えると、せいぜいambiguousだと思います。

デザインを変更できない場合は& PATINDEXを使用する場合は、パターンを事前計算します。

declare @emaildomain varchar(128) = '[email protected]' 
set @emaildomain = '%;' + stuff(@emaildomain, 1, charindex('@', @emaildomain), '') + ';%' 

次に、where句でそれを使用します。

where patindex(@emaildomain, ';' + [Domain] + ';') > 0 

(私はそう[email protected]aaabbb.com;と一致しません;区切り文字で埋め)

+0

この 'PATINDEX'を使うと、'; 'でドメインを起動する必要がありますか? –

+0

LIKEと同じです。 '%aaa.com'はxxxaaa.comの' xxxaaa.com'にマッチします; 'bbb.com'は' ;; 'が'%; aaa.com; '; xxxaaa.com;のbbb.comであることを確認します; '(つまり、この場合は一致しません) –

0

あなたが全文検索を使用して検討していますか?

インデックスを作成した後、クエリは次のようになります。

SELECT [Id] FROM [DomainGroup] WHERE CONTAINS ([Domain], 'gmail.com') 
関連する問題