2016-11-15 4 views
0

多少複雑なSELECTのSQLクエリが必要です。以下の表を仮定:3つのオプションのうちから選択するSQLクエリと、カラム値に基づいて他のテーブルから選択する

 
Table 1:        Table 2: 
name | email  | callingcardid  id | name | email 
-------|------------|--------------  ---|--------|---------------- 
first | [email protected] | null    1 | second | [email protected] 
second |   | 1 
third |   | null 

出力は次のようになります。

 
name | email 
-------|----------- 
first | [email protected] 
second | [email protected] 
third | - 

クエリは、私はそれが得ることができないので、構文は、明らかに間違っている

SELECT table1.name, COALESCE(NULLIF(table1.email, ''), 
CASE WHEN table1.callingcardid != NULL 
THEN (SELECT table2.email WHERE id = table1.callingcardid) ELSE '-' END) "email" 

のようなものでなければなりません作業。他のテーブルからの結合を持つ他のいくつかの列がありますが、それ以外の場合は動作します。 CASE句が問題メーカーです。

データベースは、Microsoft SQL Server 2008(または2012)です。

+0

?。完全なSQLクエリを提供できますか? –

+0

FROM句はありませんか? – jarlh

答えて

1

COALESCEを試してみてください。

SELECT 
    t1.name 
    ,COALESCE(t1.email, t2.email,'-') email 
FROM Table1 t1 
LEFT JOIN Table2 t2 
    ON t1.callingcardid = t2.id 
+0

ありがとう、私はそれを複雑化していた。これは簡単で機能します。面白い、ちょうど私がそれを働かせたとき、クライアントのソフトウェアがtable2に存在するならば、電子メールをtable1に自動的に更新するので、私はクエリを必要としないことも判明します:P – Sami

0

このクエリは、電子メールがNULLまたは最初のテーブルの空の文字列になる可能性を考慮しています。どちらの場合も、2番目のテーブルからの電子メールが使用されます。電子メール情報が利用できない場合は、その電子メールに対して単一のダッシュが表示されます。あなたのJOINさ

SELECT t1.name, 
     CASE WHEN COALESCE(t1.email, '') = '' 
      THEN COALESCE(t2.email, '-') 
      ELSE t1.email END AS email 
FROM table1 t1 
LEFT JOIN table2 t2 
    ON t1.callingcardid = t2.id 
0
SELECT Table1.name 
     , CASE WHEN ISNULL(Table1.email,'') = '' 
       THEN Table2.email 
       ELSE Table1.email 
     END Email 
FROM Table1 
LEFT OUTER JOIN Table2 ON Table1.name = Table2.name 
関連する問題