【问题标题】:SQL query to select out of 3 options and from other table, based on column value基于列值从 3 个选项和其他表中选择的 SQL 查询
【发布时间】:2017-03-29 06:10:39
【问题描述】:

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

表 1: 表 2: 姓名 |电子邮件 |电话卡ID |姓名 |电子邮件 -------|------------|-------------- ---|--------|-- -------------- 第一 |电子邮件@mail.com |空 1 |第二 | second@mail.com 第二 | | 1 第三| |空值

输出应该是:

姓名 |电子邮件 --------|----------- 第一 |电子邮件@mail.com 第二 | second@mail.com 第三| -

查询应该类似于

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)。

【问题讨论】:

  • 您的 JOIN 在哪里?您能提供完整的 SQL 查询吗?。
  • 没有 FROM 子句?

标签: sql sql-server tsql select case


【解决方案1】:

尝试使用COALESCE,类似这样;

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

【讨论】:

  • 谢谢,我把它弄复杂了。这很简单并且有效。有趣的是,当我开始工作时,结果发现我什至不需要查询,因为客户端的软件会自动将电子邮件更新到 table1,如果它存在于 table2 上:P
【解决方案2】:

此查询考虑到电子邮件可能是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

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 2015-02-20
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      相关资源
      最近更新 更多