Как заказать по массиву в knex?

Обновлено: я принял ответ, так как кажется, что он должен работать, но я применил другой подход, который больше не требует этого.

Мне действительно нужна помощь, чтобы понять это, как мне заказать массив в 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() и поместить массив, но он, похоже, не принимает мой массив и просто вылетает.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не похоже, что у 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`);

Обратите внимание, что это предполагает, что значения в вашем массиве можно безопасно вводить непосредственно в запрос. Если значения небезопасны, я бы предложил использовать позиционные аргументы/привязки вместо прямой вставки значений.

Другие вопросы по теме