Обновлено: я принял ответ, так как кажется, что он должен работать, но я применил другой подход, который больше не требует этого.
Мне действительно нужна помощь, чтобы понять это, как мне заказать массив в knex?
Я выбираю с помощью массива, но важен порядок массива. Используя это: knex("пользователи").select("id", "name").whereIn("song_num", [4, 1, 34]) Возвращает мне данные в порядке 1, 4, 34. Я хочу 4, 1, 34 Есть ли способ заказать исходную последовательность массива в knex?
Я искал, и это возможно, например, в MySQL с помощью FIELD или в PostgresSQL с использованием ORDINALITY. Есть ли способ сделать это в knex? Также есть orderByRaw, но я не могу заставить его работать
Пример в MySQL:
ВЫБЕРИТЕ * ИЗ comments
ГДЕ comments
.id
В ('12','5','3','17')
ЗАКАЗАТЬ ПО ПОЛЯМ(comments
.id
,'12','5','3','17')
Пример в Постгресе: ВЫБЕРИТЕ c.* ИЗ комментариев c ПРИСОЕДИНЯЙТЕСЬ к unnest('{1,3,2,4}'::int[]) С ПОРЯДКОМ t(id, ord) ИСПОЛЬЗОВАНИЕ (id) ЗАКАЗАТЬ ПО т.орд;
Спасибо!!! Я использую базу данных 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`);
Обратите внимание, что это предполагает, что значения в вашем массиве можно безопасно вводить непосредственно в запрос. Если значения небезопасны, я бы предложил использовать позиционные аргументы/привязки вместо прямой вставки значений.