EDIT:我已经接受了这个答案,因为它似乎应该有效,但我已经做了一种不同的方法,不再需要这个
我真的需要一些帮助来解决这个问题,我该如何通过knex中的数组订购?
我选择使用数组,但数组的顺序很重要。使用此:knex("users")。选择("id","name")。其中In("song_num",[4,1,34])按1、4、34的顺序返回数据。我想要的是4,1,34有没有一种方法可以按照knex中数组的原始序列排序?
我已经搜索过了,例如在MySQL中使用FIELD,或者在PostgresSQL中使用ORDINALITY。在knex有办法做到这一点吗?还有一个订单ByRaw,但我似乎无法让它工作
MySQL中的示例:从comments
中选择*其中comments
。id
英寸('12','5','3','17')按字段排序(comments
.id
,'12','5','3','17')
Postgres中的示例:选择c*FROM注释cJOIN unnest("{1,3,2,4}"::int[])与ORDINALITY t(id,ord)USING(id)按t.ord订购;
谢谢!!!如果很重要的话,我使用的数据库是sqlite
我尝试使用orderByRaw()并放置一个数组,但它似乎不接受我的数组,只是导致崩溃
看起来sqlite没有很好的方法来做到这一点,建议的方法似乎是使用case语句sqlite和的自定义订单
您可以通过orderByRaw
这样做来实现这一点:
const songNumbers = [4, 1, 34];
const results = await knex("users")
.select("id", "name").whereIn("song_num", [4, 1, 34])
.orderByRaw(`CASE song_num ${songNumbers.map((val, idx) => `WHEN ${val} THEN ${idx}`).join(' ')} END`);
请注意,这假设数组中的值可以安全地直接注入到查询中。如果这些值不安全,那么我建议使用位置参数/绑定,而不是直接插入值。