2016-11-15 68 views
0

我需要一个SQL查询来处理复杂的SELECT。假设如下表:SQL查询从3个选项中选择,并根据列值从其他表中选择

 
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

谢谢,我过来使它复杂化。这很简单,很有效。有趣的是,当我得到它的工作,事实证明我甚至不需要查询,因为客户端软件自动更新电子邮件到table1,如果它存在table2:P – Sami

0

该查询考虑到电子邮件可能是NULL或第一个表中的空字符串的可能性。在这两种情况下,都会使用第二张表中的电子邮件。如果没有电子邮件信息可用,电子邮件将显示一个短划线。

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