SQL查询根据列值从3个选项中选择,并从其他表中选择

时间:2016-11-15 11:18:24

标签: sql sql-server tsql select case

我需要一个有点复杂的SELECT的SQL查询。假设有以下表格:

Table 1:                                Table 2:  
name   | email      | callingcardid     id | name   | email
-------|------------|--------------     ---|--------|----------------
first  | e@mail.com | null              1  | second | second@mail.com 
second |            | 1
third  |            | null

输出应为:

name   | email
-------|-----------
first  | e@mail.com
second | second@mail.com
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)。

3 个答案:

答案 0 :(得分:1)

尝试使用COALESCE,类似这样的内容;

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

答案 1 :(得分: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

答案 2 :(得分: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