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

如何在MariaDB中按指定顺序返回包含空值的行

保持原始查询列表顺序的SQL解决方案

问题出在你用ORDER BY validade asc时,不存在的05.173对应的validade是null,SQL里null在升序排序时会排在最前面,直接打乱了原始列表的顺序。要保留原始顺序,你需要给子查询里的每条记录标记原始位置,最后按这个位置排序。

方案1:支持窗口函数的数据库(MySQL 8+、PostgreSQL、SQL Server等)

给子查询a添加行号记录原始顺序,最后按行号排序:

SELECT b.*, a.sia_id
FROM (
    SELECT '02.352' AS sia_id, ROW_NUMBER() OVER () AS row_num
    UNION ALL
    SELECT '05.173' AS sia_id, ROW_NUMBER() OVER () AS row_num
    UNION ALL
    SELECT '02.352' AS sia_id, ROW_NUMBER() OVER () AS row_num
    UNION ALL
    SELECT '05.173' AS sia_id, ROW_NUMBER() OVER () AS row_num
    UNION ALL
    SELECT '05.451' AS sia_id, ROW_NUMBER() OVER () AS row_num
) AS a
LEFT JOIN estoques AS b
    USING (sia_id)
ORDER BY a.row_num ASC;

方案2:不支持窗口函数的旧版MySQL(如MySQL 5.x)

用用户变量生成行号:

SELECT b.*, a.sia_id
FROM (
    SELECT @row_num := @row_num + 1 AS row_num, t.sia_id
    FROM (
        SELECT '02.352' AS sia_id
        UNION ALL
        SELECT '05.173' AS sia_id
        UNION ALL
        SELECT '02.352' AS sia_id
        UNION ALL
        SELECT '05.173' AS sia_id
        UNION ALL
        SELECT '05.451' AS sia_id
    ) AS t, (SELECT @row_num := 0) AS init
) AS a
LEFT JOIN estoques AS b
    USING (sia_id)
ORDER BY a.row_num ASC;

效果说明

修改后,查询结果会严格按照你子查询里sia_id的原始顺序返回:存在的记录显示对应数据,不存在的05.173会保留在它原本的位置上,输出结果完全符合你的预期。

内容的提问来源于stack exchange,提问作者marcelo.delta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:51:31