【问题标题】:Select IF EXISTS as a BIT column选择 IF EXISTS 作为 BIT 列
【发布时间】:2016-12-10 23:31:05
【问题描述】:

我有一个查询,目前看起来像这样:

 SELECT
     d.Region_Name
    , d.Dealer_Name
    , RIGHT(r.Vin,8) AS VIN
FROM 
    tblCCDealerCall_Customer c
    JOIN tblCCDealerCall d ON c.DealerID = d.DealerID
    JOIN tblReservation_TestDrive r ON r.CustomerID = c.CustomerID

很简单。但是,现在我想添加一个名为 IsVinActive 的第四列,它是一个 BIT。我需要检查另一个表 tblVinDisabledDate,以查看当前 VIN 是否存在于该表中。

我可以使用此查询来查看该表中是否存在 VIN:

SELECT CASE WHEN EXISTS 
(
    SELECT 1 FROM tblVinDisabledDate vd WHERE vd.Vin = '2LMPJ6LP5GBL54709'
)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT) END

但我不确定将其集成到第一个查询中的最佳方法。

谢谢!

【问题讨论】:

    标签: sql tsql select join


    【解决方案1】:

    你快到了。试试这个。

    SELECT
         d.Region_Name
        , d.Dealer_Name
        , RIGHT(r.Vin,8) AS VIN
        , CASE WHEN EXISTS (SELECT 1 FROM tblVinDisabledDate WHERE Vin = r.Vin)
          THEN CAST(1 AS BIT)
          ELSE CAST(0 AS BIT) END
    FROM tblCCDealerCall_Customer c
    JOIN tblCCDealerCall d ON c.DealerID = d.DealerID
    JOIN tblReservation_TestDrive r ON r.CustomerID = c.CustomerID
    

    如果您想避免相关查询,join 另一个表也是如此。

    SELECT
          d.Region_Name
        , d.Dealer_Name
        , RIGHT(r.Vin,8) AS VIN
        , CASE WHEN vd.vin is not null then CAST(1 AS BIT) ELSE CAST(0 AS BIT) END 
    FROM tblCCDealerCall_Customer c
    JOIN tblCCDealerCall d ON c.DealerID = d.DealerID
    JOIN tblReservation_TestDrive r ON r.CustomerID = c.CustomerID
    LEFT JOIN tblVinDisabledDate vd ON vd.Vin = r.Vin
    

    【讨论】:

    • 好吧——真的这么简单吗?有人告诉我,在构建列时要不惜一切代价避免内部 SELECT 语句。想知道是否有更优雅、更便宜的方式。
    • 为什么使用exists 的case 而不是将subselect 包装在isnull 中? CONVERT(BIT,ISNULL(SELECT 1 FROM ....),0))
    • 提示:您可以将 CASE 包装在单个 CAST 中,而不是强制转换每个值。我经常在存储过程中使用declare @True as Bit = 1, @False as Bit = 0;,然后在查询中使用这些变量来明确意图并消除强制转换的需要。
    【解决方案2】:
    ;With cte
    as
    (
    SELECT
         d.Region_Name
        , d.Dealer_Name
        , RIGHT(r.Vin,8) AS VIN
    FROM 
        tblCCDealerCall_Customer c
        JOIN tblCCDealerCall d ON c.DealerID = d.DealerID
        JOIN tblReservation_TestDrive r ON r.CustomerID = c.CustomerID
    )
    select * ,case when b.vin is null then 0 else 1 end as 'somecol 
    from cte c
    outer apply
    (select 1  as vin from tblVinDisabledDate vd where vd.vin=c.vin) b
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-17
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 2017-02-12
      • 1970-01-01
      • 2017-06-13
      相关资源
      最近更新 更多