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

NestJS+TypeORM+Postgres实现先字母后数字排序遇TypeORMError求助

解决TypeORM中Postgres排序问题:让字母开头项排在数字前

要实现[A-Z][0-9]的升序排序(字母开头的条目优先,之后是数字开头的,各自内部按名称排序),你之前的代码报错是因为TypeORM将你的CASE表达式误识别为实体别名,而非原生SQL片段。以下是正确的实现方式:

解决方案

  1. 首先导入TypeORM的Raw工具函数:
import { Raw } from 'typeorm';
  1. 修改排序逻辑,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:54:14