2016-05-30 7 views
0

私の前には本当に面白い要件があります。私はカーソルの使用について考えましたが、私が望むものを手に入れることができるかどうかはわかりません。 FirstName、LastName、Email1、Email2、Email3、Email4のようなレコードごとに複数のメールを含むContactテーブルがあります。そのため、要件は、ファーストネームまたはラストネームのいずれかを含む電子メールを見つけ、その電子メールをプライマリ電子メールとして選択することです。それをSQLで書くためのエレガントな方法はありますか?姓または姓が一致する複数の電子メールからプライマリ電子メールを選択

ContactId FirstName  LastName  Email1   Email2    Email3 
--------- ---------  --------  ---------   ------    ------ 
     1  Jeremy   Lin  [email protected]   [email protected]  [email protected] 
     2  Sarah  Woods  [email protected]  [email protected]  [email protected] 
     3  Peter  Wilkins  [email protected] [email protected]  null 

期待される結果:

ContactId FirstName  LastName  Email 
--------- ---------  --------  --------- 
     1  Jeremy   Lin  [email protected] 
     2  Sarah  Woods  [email protected]  
     3  Peter  Wilkins  [email protected] 
+0

カーソルは単なるSQL文です。カーソルを使用するかどうかには違いはありません。 3つの電子メールしか持っていない場合は、「LIKE」を使って何が問題になっていますか?これを「エレガントな」ものにするために書くものは何も見つかりません:-) – Ben

+0

CONTAINSを試しましたか? –

+0

@Ben「CONTAINS」は、ある形式の索引(この場合はフルテキスト索引)を使用できるため、高速にすべきだと思います。もちろん、この形式の問合せは、列がフルテキスト索引にある場合にのみ使用できます。そうでない場合は、最初のフォームのみが使用可能です。しかし、 'LIKE'を使うと、ワイルドカードで始まるのでインデックスを使うことができないので、常にフルテーブルスキャンが必要です。 –

答えて

3

私はエレガントそれを呼び出すことはありませんが、それは複雑ではない、と確かにカーソルを必要としない:

select 
    ContactId, FirstName, LastName, 
    case 
     when (Email1 like '%'+FirstName+'%' or Email1 like '%'+LastName+'%') then Email1 
     when (Email2 like '%'+FirstName+'%' or Email2 like '%'+LastName+'%') then Email2 
     when (Email3 like '%'+FirstName+'%' or Email3 like '%'+LastName+'%') then Email3 
     else Email1 -- or whatever you want to use as the default 
    end as Email 
from Contacts 

上記の大文字と小文字を区別しない照合を使用していると仮定します。そうでない場合は、upper()またはlower()コールを追加する必要があります。

+0

私は同様の解決策を思いついた。これはうまくいくはずです。 〜 – bhishan

関連する問題