如何强制我的 T-SQL 查询将不匹配的值输出为零?

Posted

技术标签:

【中文标题】如何强制我的 T-SQL 查询将不匹配的值输出为零?【英文标题】:How do I force my T-SQL query to output unmatched values as zero? 【发布时间】: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 中不存在。 您首先需要确定序列中缺少哪些数字(请参阅此链接:***.com/a/1057423/100283),然后您可以加入两个数据存储,然后只需使用合并函数返回零,如果没有匹配项。 【参考方案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);

【讨论】:

以上是关于如何强制我的 T-SQL 查询将不匹配的值输出为零?的主要内容,如果未能解决你的问题,请参考以下文章

如何在这个特定的 T-SQL 查询中使用表变量?

如何修改我的T-SQL查询,以便输出基于2个不同时期出现两次或更多次的所有记录?

如何强制代码覆盖率为零?

插入查询:列名或提供的值的数量与表定义不匹配

尝试在 T-SQL 查询中使用 Levenshtein 距离 - 请帮助优化

如何在T-SQL中使用递归CTE获得完整的层次结构?