【问题标题】:If null in one table select from Other如果一个表中为空,则从其他中选择
【发布时间】:2019-06-28 15:24:06
【问题描述】:

我有 2 个表查询和应用程序表,我想根据这两个表中的数据构建一个包含用户信息的视图。

例子

我有表查询

名字、姓氏、地址、电子邮件

我有表应用程序

名字、姓氏、地址、电子邮件

我正在使用电子邮件字段查询表格,这就是我想要的,

从 InquiryTBL 中选择名字,其中电子邮件 = @Email If Null Select FirstName From ApplictionTBL where email = @email

这有点像我一直在尝试的

 SELECT 
      CASE
      WHEN a.Email = null
  THEN (SELECT FirstName from dbo.Inquiry_Tbl where email = @Email)
  ELSE a.FirstName
  END As [FirstName],  

【问题讨论】:

  • SELECT COALESCE(i.Firstname, a.Firstname) FROM InquiryTBL i LEFT OUTER JOIN ApplicationTBL a ON i.email = a.email WHERE i.email = @email
  • 注意:如果电子邮件在两个表中,我在此处留下的 SQL 注释将有效,但如果它仅在一个表中,则无效。请参阅下面的答案以获得更全面的查询。

标签: sql sql-server


【解决方案1】:

如果电子邮件在两个表中或仅在一个表中,请在子选择内的email 上使用FULL OUTER JOIN。然后您可以按您需要的电子邮件地址过滤该子选择。

DECLARE @email varchar(20) = 'ted@excellent.com' ;

SELECT s1.FirsTName, s1.LastName, s1.Email
FROM (
  SELECT COALESCE(i.FirstName, a.FirstName) AS FirstName
    , COALESCE(i.LastName, a.LastName) AS LastName
    , COALESCE(i.email, a.email) AS email
  FROM InquiryTBL i
  FULL OUTER JOIN ApplicationTBL a ON i.email = a.email
) s1
WHERE s1.Email = @email
;

https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=62d0f0a1026150de6b4fd9be3d058dbb

注意:要选择第一个非空值,您可以使用coalesce()isnull()coalesce() 符合 ANSI,可以接受超过 2 个参数,并且可以在大多数数据库中使用。 isnull() 主要是一个 Microsoft T-SQL 函数,只接受 2 个参数。在某些情况下它可能比coalesce() 更快,但它不那么便携。两者还将在您选择的顺序中选择第一个非空值,因此您可以先更改您想要的值。

【讨论】:

    【解决方案2】:

    如果 email 在两个表中,您可以在该字段上 JOIN,然后使用 COALESCE 提取非空数据:

    SELECT 
        Email = COALESCE( i.Email, a.Email)
        , FirstName = COALESCE(i.FirstName, a.FirstName)
        , LastName = COALESCE(i.LastName, a.LastNamej)
    FROM InquiryTBL i
        LEFT JOIN ApplicationTBL a
            ON i.Email = a.Email
    

    【讨论】:

    • 你需要一个 FULL OUTER JOIN
    • @GordonLinoff 好吧,用例还不清楚。 FULL OUTER JOIN 会更完整。无论如何,当我发表评论时,这个答案是一个 INNER JOIN,它已经被编辑过了。 INNER JOIN 肯定不符合要求。
    猜你喜欢
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2018-09-26
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多