为何priority=50000的数据排在priority=NULL前?(排序规则ASC)
问题:ORDER BY子句排序结果不符合预期
当前使用的ORDER BY子句:
ORDER BY CASE WHEN priority IS NULL THEN 10000 END, priority, id
期望将priority为50000的记录排在结果末尾,但实际输出中这类记录紧邻priority为NULL的记录之前,与预期不符:
实际输出示例:
priority 1 record priority 2 record priority 50000 record priority NULL record priority NULL record (后续均为NULL记录)
期望输出示例:
priority 1 record priority 2 record priority NULL record priority NULL record . . . priority 50000 record priority 50000 record
涉及的表结构:
CREATE TABLE `catalog` ( `id` bigint(20) NOT NULL, `priority` int(11) DEFAULT NULL, `title` text NOT NULL, `author` tinytext NOT NULL, `description` text NOT NULL, `rate` smallint(6) NOT NULL DEFAULT 20, `retail_price` mediumint(9) NOT NULL, `stock` tinyint(4) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
原因分析
原CASE语句仅处理了priority IS NULL的情况,返回10000;对于非NULL的priority值,CASE语句没有对应的返回值,默认返回NULL。而在SQL排序规则中,NULL值会排在所有非NULL值之前,所以priority=50000的记录(对应CASE结果为NULL)会排在CASE结果为10000的NULL记录之前,导致排序不符合预期。
解决方案
修改CASE语句,让非NULL的priority值返回自身,确保排序键的逻辑连贯:
ORDER BY CASE WHEN priority IS NULL THEN 10000 ELSE priority END, priority, id
逻辑说明
- 当
priority为NULL时,排序键设为10000; - 当
priority非NULL时,排序键直接使用priority本身的值; - 由于50000 > 10000,
priority=50000的记录会排在所有priority为NULL的记录之后,同时保留原有的priority和id排序逻辑。
修改后的排序结果会完全符合期望,priority为NULL的记录集中排在中间段,priority=50000的记录则出现在结果末尾。
内容的提问来源于stack exchange,提问作者Neptune
相关产品推荐
相关产品推荐

