NestJS+TypeORM+Postgres实现先字母后数字排序遇TypeORMError求助
解决TypeORM中Postgres排序问题:让字母开头项排在数字前
要实现[A-Z][0-9]的升序排序(字母开头的条目优先,之后是数字开头的,各自内部按名称排序),你之前的代码报错是因为TypeORM将你的CASE表达式误识别为实体别名,而非原生SQL片段。以下是正确的实现方式:
解决方案
- 首先导入TypeORM的
Raw工具函数:
import { Raw } from 'typeorm';
- 修改排序逻辑,用
Raw包裹CASE表达式,明确告知TypeORM这是原生SQL:
sellablesRespQuery // 先按"是否字母开头"分组:字母开头的排前面 .addOrderBy(Raw(alias => `CASE WHEN ${alias}.name ~ '^[a-zA-Z]' THEN 0 ELSE 1 END`), 'ASC') // 再按名称本身升序排序 .addOrderBy('sellable.name', 'ASC');
逻辑说明
Raw(alias => ...):alias参数会自动代入当前实体的别名(这里是sellable),避免硬编码别名导致的错误。CASE WHEN ${alias}.name ~ '^[a-zA-Z]' THEN 0 ELSE 1 END:Postgres中用~匹配正则表达式,字母开头的条目返回0,数字开头的返回1;升序排序时0在前,所以字母组会排在数字组之前。- 第二个
addOrderBy保证同一分组内(字母组或数组组)的条目按名称本身升序排列。
错误原因
你之前直接将CASE表达式字符串传给addOrderBy,TypeORM默认会把这个字符串当作实体关联别名或列名去查找,自然找不到对应的别名,因此抛出"case when sellable" alias was not found的错误。使用Raw函数可以明确告诉TypeORM直接执行这段SQL片段,而非解析为别名。
内容的提问来源于stack exchange,提问作者jerome
相关产品推荐
相关产品推荐

