【问题标题】:Return true (1), if a joined data entry exists, else false (0) in MS-SQL如果存在连接的数据条目,则返回 true (1),否则在 MS-SQL 中返回 false (0)
【发布时间】:2019-09-02 07:44:58
【问题描述】:

我有一个 SQL 语句,它以一对一的关系连接到两个不同的表。对于这些连接中的每一个,如果连接成功与否,我想返回一个 BIT 值(0 或 1)。

假设我们有一个基表Base 和表AB,它们通过一个公共ID 上的LEFT JOIN 连接在一起。我想返回ID,还有一个字段IsA和一个字段IsB

在 Microsoft SQL Server 中最有效地执行此操作的最佳实践解决方案是什么?

顺便说一下,我目前的做法是这样的:

CAST(ISNULL(A.ID, 0) AS BIT) AS IsA,
CAST(ISNULL(B.ID, 0) AS BIT) AS IsB

【问题讨论】:

  • 您的解决方案很短(这很好),但它依赖于转换为位会将任何非零值提升为 1 的事实(这可能不直观)。我认为答案中提出的 CASE-WHEN-solutions 更具可读性。

标签: sql sql-server join


【解决方案1】:

您可以使用以下内容,使用CASE WHEN 而不是ISNULL

SELECT Base.*, A.id, B.id, 
  CAST(CASE WHEN A.id IS NULL THEN 0 ELSE 1 END AS BIT) AS IsA,
  CAST(CASE WHEN B.id IS NULL THEN 0 ELSE 1 END AS BIT) AS IsB
FROM Base LEFT JOIN A ON Base.id = A.base_id
  LEFT JOIN B ON Base.id = B.base_id

demo on dbfiddle.uk

与您当前的方法相比,此解决方案具有相同的效率。但也请参阅this answer (check multiple columns for NULL values)。在那里您可以看到ISNULL 解决方案的效率较低。在你的情况下,这没什么大不了的。

还要小心:如果列值为0ISNULL 也可以返回0。因此,在这种情况下,按照您当前的方法,您会得到False

【讨论】:

  • 这会比我目前的方法更有效吗?
  • 最后一点很重要。非常有说服力,您的解决方案更好。
【解决方案2】:

我个人会这样做:

Cast(CASE WHEN A.ID IS NULL THEN 0 ELSE 1 END AS bit) AS IsA

【讨论】:

  • 查看@Sebastian 的回答:这会比我目前的方法更有效吗?
  • @AndréReichelt - 假设您在连接字段上有索引并且您的方案如所述,那么这将尽可能高效。我分享的方法应该与您的方法相同,但我会说这是更清晰
猜你喜欢
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多