【问题标题】:Selecting columns based on a case SQL根据案例 SQL 选择列
【发布时间】:2014-12-12 08:47:28
【问题描述】:

我想知道如何根据我选择的第一个语句返回特定结果。基本上我有两个ID。 CustBillToID 和 CustShipToID。如果 CustShipToID 不为空,我想选择它以及加入它的所有记录。如果它为 null,则默认为 CustBillToID 以及与之连接的所有结果。

这是我的 SQL,显然不起作用。我应该提到我尝试在条件中进行子查询,但是由于它返回多个结果,因此它不起作用。我正在使用 SQL Server 2012。

SELECT  CASE WHEN cp.CustShipToID IS NOT NULL 
                   THEN
                   cy.CustDesc,
                   cy.Address1,
                   cy.Address2,
                   cy.City,
                   cy.State,
                   cy.ZIP,
                   cy.Phone
                   ELSE
                   c.CustDesc,
                   c.Address1,
                   c.Address2,
                   c.City,
                   c.State,
                   c.ZIP,
                   c.Phone
                   END
                   LoadID,
                   cp.CustPOID,
                   cp.POBillToRef,
                   cp.POShipToRef,
                   cp.CustBillToID,
                   cp.CustShipToID,
                   cp.ArrivalDate,
                   cp.LoadDate,
                   cp.StopNum,
                   cp.ConfNum,
                   cp.EVNum,
                   cp.ApptNum,
                   ld.CarrId,
                   ld.Temperature,
                   cr.CarrDesc

 FROM [Sales].[dbo].[CustPO] AS cp
              LEFT OUTER JOIN Load AS ld
              ON cp.LoadID = ld.LoadID
              LEFT OUTER JOIN Carrier AS cr
              ON ld.CarrId = cr.CarrId
              LEFT OUTER JOIN Customer AS c
              ON c.CustId = cp.CustBillToID
              WHERE CustPOID=5213

有什么想法吗?

下面是我当前的 SQL,我做一个条件来确定它是否已设置。如果可能的话,我宁愿用 SQL 来做。

SELECT cp.LoadID,
                   cp.CustPOID,
                   cp.POBillToRef,
                   cp.POShipToRef,
                   cp.CustBillToID,
                   cp.CustShipToID,
                   cp.ArrivalDate,
                   cp.LoadDate,
                   cp.StopNum,
                   cp.ConfNum,
                   cp.EVNum,
                   cp.ApptNum,
                   ld.CarrId,
                   ld.Temperature,
                   cr.CarrDesc,
                   c.CustDesc as CustBillToDesc,
                   c.Address1 as CustBillAddress1,
                   c.Address2 as CustBillAddress2,
                   c.City as CustBillCity,
                   c.State as CustBillState,
                   c.ZIP as CustBillZIP,
                   c.Phone as CustBillPhone,
                   cy.CustDesc as CustShipToDesc,
                   cy.Address1 as CustShipAddress1,
                   cy.Address2 as CustShipAddress2,
                   cy.City as CustShipCity,
                   cy.State as CustShipState,
                   cy.ZIP as CustShipZIP,
                   cy.Phone as CustShipPhone

              FROM [Sales].[dbo].[CustPO] as cp
              left outer join Load as ld
              on cp.LoadID = ld.LoadID
              left outer join Carrier as cr
              on ld.CarrId = cr.CarrId
              left outer join Customer as c
              on c.CustId = cp.CustBillToID
              left outer join Customer as cy
              on cy.CustId = cp.CustShipToID
              WHERE CustPOID=?

【问题讨论】:

    标签: sql sql-server sql-server-2012 conditional


    【解决方案1】:

    您需要为每一列单独的case

    SELECT (CASE WHEN cp.CustShipToID IS NOT NULL THEN cy.CustDesc ELSE  c.CustDesc END) as CustDesc,
           (CASE WHEN cp.CustShipToID IS NOT NULL THEN cy.Address1 ELSE  c.Address1 END) as Address1,
           (CASE WHEN cp.CustShipToID IS NOT NULL THEN cy.Address2 ELSE  c.Address2 END) as Address2,
           (CASE WHEN cp.CustShipToID IS NOT NULL THEN cy.City ELSE  c.City END) as City,
           (CASE WHEN cp.CustShipToID IS NOT NULL THEN cy.State ELSE  c.State END) as State,
           (CASE WHEN cp.CustShipToID IS NOT NULL THEN cy.ZIP ELSE  c.ZIP END) as ZIP,
           (CASE WHEN cp.CustShipToID IS NOT NULL THEN cy.Phone ELSE  c.Phone END) as Phone,
           . . . 
    

    【讨论】:

      【解决方案2】:

      为此,您基本上想要构建一个作为您的 SQL 的字符串,然后执行该字符串...看看@这个答案的答案 ::

      SQL conditional SELECT

      【讨论】:

      • 这看起来很完美,你
      【解决方案3】:

      您尝试过 coalesce(CustShipToID,CustBillToID ) 吗?

      ...
      FROM [Sales].[dbo].[CustPO] as cp
                left outer join Load as ld
                on cp.LoadID = ld.LoadID
                left outer join Carrier as cr
                on ld.CarrId = cr.CarrId
                inner join Customer as c
                on c.CustId = coalesce(cp.CustShipToID,cp.CustBillToID )
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        相关资源
        最近更新 更多