SQL Server:无匹配结果时返回空行的实现方法问询
当然可以实现!不管是用存储过程还是自定义表值函数,都能轻松满足你的需求。我给你几个不同场景的方案,你可以根据实际情况选择:
方案1:固定追加空行的存储过程
这个方案会在查询结果末尾始终添加一行空记录,不管目标code列表里有没有缺失的项:
CREATE PROCEDURE GetProductsWithEmptyRow AS BEGIN SET NOCOUNT ON; -- 避免返回额外的行数统计信息 -- 先查询所有匹配的产品记录 SELECT id, code, description FROM products WHERE code IN ('0001', '0002', '0003', '0009') -- 追加一行空记录 UNION ALL SELECT '' AS id, '' AS code, '' AS description; END
使用时只需执行:
EXEC GetProductsWithEmptyRow;
注意:如果你的
id列是数值类型(比如INT),要把空字符串换成NULL,避免类型不匹配错误,即SELECT NULL AS id, '' AS code, '' AS description。
方案2:固定追加空行的表值函数
如果你更倾向于用函数来实现,可以创建一个表值函数,用法和普通查询更接近:
CREATE FUNCTION dbo.GetProductsWithEmptyRow() RETURNS TABLE AS RETURN ( SELECT id, code, description FROM products WHERE code IN ('0001', '0002', '0003', '0009') UNION ALL SELECT '' AS id, '' AS code, '' AS description )
使用时直接查询这个函数:
SELECT * FROM dbo.GetProductsWithEmptyRow();
方案3:仅当存在缺失记录时追加空行
如果你的需求是只有当目标code列表里存在未匹配的项(比如例子中的0009)时,才添加空行,可以用这个带条件判断的存储过程:
CREATE PROCEDURE GetProductsWithConditionalEmptyRow AS BEGIN SET NOCOUNT ON; DECLARE @missingCodeCount INT; -- 计算目标code列表中没有匹配到的数量 SELECT @missingCodeCount = COUNT(*) FROM ( VALUES ('0001'), ('0002'), ('0003'), ('0009') ) AS TargetCodes(code) LEFT JOIN products p ON p.code = TargetCodes.code WHERE p.code IS NULL; -- 返回匹配的产品记录 SELECT id, code, description FROM products WHERE code IN ('0001', '0002', '0003', '0009'); -- 如果存在缺失的code,追加空行 IF @missingCodeCount > 0 BEGIN SELECT '' AS id, '' AS code, '' AS description; END END
这个版本会先检查哪些目标code没有找到对应记录,只有当存在缺失时才添加空行,更贴合你给出的示例场景。
内容的提问来源于stack exchange,提问作者Leonardo Silva
相关产品推荐
相关产品推荐

