You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:02:49