如何在EdgeDB中实现多列排序?解决类型错误问题
解决EdgeDB动态多列排序的类型不匹配问题
问题根源
你使用的??(空值合并)操作符要求左右两侧表达式的类型必须完全一致,但$SortColumnName是字符串类型,而你要排序的字段(比如createdDate是日期类型、noOfPosts是整数类型)与字符串类型不兼容,直接混用就会触发InvalidTypeError。
正确实现方案
EdgeDB实现动态多列排序,核心是通过条件分支显式匹配排序字段,确保每个分支返回的排序键类型一致,或者按需统一转换类型。以下分两种场景给出实现:
场景1:单字段动态排序
如果仅需按指定单个字段排序,用CASE语句判断字段名,返回对应字段值:
SELECT { data := ( SELECT default::posts { id, url, createdBy, modifiedBy, createdDate, noOfPosts } ORDER BY CASE <str>$SortColumnName WHEN 'url' THEN .url WHEN 'createdDate' THEN .createdDate WHEN 'createdBy' THEN .createdBy WHEN 'noOfPosts' THEN <str>.noOfPosts -- 整数转字符串统一类型,也可保持原类型(需确保分支类型一致) ELSE .createdDate -- 指定默认排序字段 END -- 可选:添加排序方向,例如加 DESC 实现降序 -- DESC ) }
场景2:多字段优先级排序
如果要实现多列层级排序(比如先按A字段排序,再按B字段排序,字段名均动态指定),可以用多个CASE语句分别对应不同优先级:
SELECT { data := ( SELECT default::posts { id, url, createdBy, modifiedBy, createdDate, noOfPosts } ORDER BY -- 第一优先级排序字段 CASE <str>$SortColumn1 WHEN 'url' THEN .url WHEN 'createdDate' THEN .createdDate WHEN 'createdBy' THEN .createdBy WHEN 'noOfPosts' THEN <str>.noOfPosts ELSE .createdDate END DESC, -- 可单独指定该字段的排序方向 -- 第二优先级排序字段 CASE <str>$SortColumn2 WHEN 'url' THEN .url WHEN 'createdDate' THEN .createdDate WHEN 'createdBy' THEN .createdBy WHEN 'noOfPosts' THEN <str>.noOfPosts ELSE .id END ) }
关键注意事项
- 绝对避免用
??直接混合不同类型的表达式,必须通过CASE做显式分支处理或类型统一。 - 如果不需要统一类型,要确保
CASE的每个分支返回的类型是可比较的(比如日期和日期、字符串和字符串),EdgeDB会自动校验类型一致性。 - 若排序参数是可选的,可结合
OPTIONAL处理空值场景:CASE OPTIONAL <str>$SortColumnName WHEN 'url' THEN .url WHEN 'createdDate' THEN .createdDate ELSE .createdDate END
内容的提问来源于stack exchange,提问作者Sneh Panara
相关产品推荐
相关产品推荐

