在Sequelize排序中将空值与空字符串置于末尾的实现方案
Sequelize排序:将NULL和空字符串置于结果末尾
PostgreSQL默认仅会把NULL值排在排序结果末尾,但空字符串''会被当作普通字符串处理,无法和NULL一起归到末尾。要实现优先展示同时拥有非空非空字符串的firstName和lastName的记录,其余(任意字段为空/空字符串)排在末尾的需求,可以通过自定义排序逻辑实现:
解决方案代码
const { sequelize } = require('./your-sequelize-instance-path'); // 引入你的Sequelize实例 data = await Provider.findAll({ where: { search }, order: [ // 优先排序:两个字段都非空且非空字符串的记录在前 [sequelize.literal(`(lastName IS NOT NULL AND lastName != '' AND firstName IS NOT NULL AND firstName != '')`), 'DESC'], // 组内按 lastName、firstName 升序排序 ['lastName', 'ASC'], ['firstName', 'ASC'] ] });
逻辑说明
- 第一个排序条件通过
sequelize.literal直接生成SQL判断表达式:- 当
lastName和firstName同时满足不为NULL且不是空字符串时,表达式返回true(对应数值1),DESC排序让这类记录排在最前面。 - 任意字段为空/空字符串的记录会返回
false(对应数值0),自动被归到结果末尾。
- 当
- 后续的
lastName、firstName升序排序,保证前面的有效记录组内按正常规则排序。
验证场景
- 对于
lastName非空但firstName为空字符串的记录,会被归到末尾,符合你给出的期望结果。 - 对于
lastName为空字符串但firstName非空的记录,同样会被归到末尾,满足你的排序需求。
内容的提问来源于stack exchange,提问作者Waqar Ali
相关产品推荐
相关产品推荐

