如何强制我的 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查询,以便输出基于2个不同时期出现两次或更多次的所有记录?