【问题标题】:How do I force my T-SQL query to output unmatched values as zero?如何强制我的 T-SQL 查询将不匹配的值输出为零?
【发布时间】:2017-12-11 09:57:37
【问题描述】:

我正在使用SQL Server 2014,我有一个简单的T-SQL 查询(如下所示)及其相应的输出。

use mydatabase

select *

from Table1

where ID in (101, 102, 103)

输出如下(表示表1中不存在ID 102):

ID   Age
101   46
103   50

我希望输出如下:

ID    Age
101   46
102    0
103   50

当查找表中的 ID 不匹配时,输出会忽略这些 ID。如何更改我的 T-SQL 查询以确保也输出不匹配的 ID,但输出为零。

【问题讨论】:

  • 还有没有其他表格可以存储您的所有身份证件?
  • ID 是数据库中不同表中的主键,但我没有保存所有 IDS 的表。
  • 因此,如果您没有 ID 表,您如何知道哪些 ID 是实际 ID,以及来自 Table1 的“缺失”。
  • @Larnu 为简化起见,我有一个 ID 列表(我已经知道它存在于另一个表中,我们称之为 Table0),我需要对照 Table1 进行检查。由于 ID 102 不在输出中,这意味着它在 Table1 中不存在。
  • 您首先需要确定序列中缺少哪些数字(请参阅此链接:stackoverflow.com/a/1057423/100283),然后您可以加入两个数据存储,然后只需使用合并函数返回零,如果没有匹配项。

标签: sql-server tsql


【解决方案1】:

如果您有 2 个或更多表,并且希望在一个表中找不到匹配项时显示一些默认值,那么您可以在 SQL 中使用外连接。

例如:

我有 2 个表 TableA 和 TableB。

当我进行内部连接时,我会得到两个表中都匹配的记录。假设我需要从两个表中选择 id 1,2 和 3,即使 TableB 中不存在一个 id 我希望记录为 NULL,那么我可以使用它

select
A.Id,
A.Name,
Age = ISNULL(B.Age,0)
    from TableA a
    left join TableB b
    on A.id = b.id

如果tableB中的id没有匹配的记录,这里Age会显示为0

【讨论】:

    【解决方案2】:

    如果没有包含您正在查找的值的表,那么您可以使用 join 并在 coalesce()isnull() 函数的帮助下将不匹配的值替换为 0

    select a.id, coalesce(t.age, 0) [Age] from <table> t
    right join (
           values (101), (102), (103)
    ) a(id) on a.id = t.id
    

    结果:

    id  Age
    101 46
    102 0
    103 50
    

    【讨论】:

      【解决方案3】:
      SELECT T0.ID
             ISNULL(T1.Age,0) AS Age
      FROM Table0 T0
           LEFT JOIN Table1 T1 ON T0.ID = T1.ID
      WHERE T0.ID IN (101,102,103);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多