sqlite 如何在knex中对数组排序?

crcmnpdw  于 2023-04-21  发布在  SQLite
关注(0)|答案(1)|浏览(122)

编辑:我已经接受了这个答案,因为它看起来应该可以工作,但是我已经做了一个不同的方法,不再需要这个了
我真的需要一些帮助来解决这个问题,我如何在knex中对数组进行排序?
我选择使用数组,但数组的顺序很重要。使用这个:knex(“users”).select(“id”,“name”).whereIn(“song_num”,[4,1,34])返回数据的顺序为1,4,34。我想要的是4,1,34。
我已经搜索过了,例如在MySQL中使用FIELD或在PostgreSQL中使用ORDINALITY是可能的。有没有一种方法可以在knex中做到这一点?还有一个orderByRaw,但我似乎无法让它工作
MySQL中的示例:SELECT * FROM comments WHERE comments . id IN('12 ','5','3 ','17')ORDER BY FIELD(comments . id,'12 ','5','3 ','17')
Postgres中的示例:SELECT c.* FROM comments c JOIN unnest('{ 1,3,2,4}'::int[])WITH ORDINALITY t(id,ord)USING(id)ORDER BY t.ord;
谢谢!!!我使用的数据库是sqlite如果它的问题
我尝试使用orderByRaw()并放置一个数组,但它似乎不接受我的数组,只是崩溃

qnzebej0

qnzebej01#

看起来sqlite并没有很好的方法来实现这一点,建议的方法似乎使用了case语句SQLite and custom order by
你可以通过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`);

注意,这里假设数组中的值可以安全地直接注入到查询中。如果值不安全,那么我建议使用位置参数/绑定,而不是直接插入值。

相关问题