Упорядочение по порядку значений в предложении SQL IN ()

Подумайте, используя strtok_r, как предложили другие, или что-то вроде:

void printWords(const char *string) {
    // Make a local copy of the string that we can manipulate.
    char * const copy = strdup(string);
    char *space = copy;
    // Find the next space in the string, and replace it with a newline.
    while (space = strchr(space,' ')) *space = '\n';
    // There are no more spaces in the string; print out our modified copy.
    printf("%s\n", copy);
    // Free our local copy
    free(copy);
}
140
задан Patrick Kostjens 4 June 2016 в 10:14
поделиться

5 ответов

Используйте функцию MySQL FIELD() :

SELECT name, description, ...
FROM ...
WHERE id IN([ids, any order])
ORDER BY FIELD(id, [ids in order])

FIELD() возвратит индекс первого параметра, который равен первому параметру (кроме самого первого параметра).

FIELD('a', 'a', 'b', 'c')

возвратится 1

FIELD('a', 'c', 'b', 'a')

, возвратится 3

, Это сделает точно, что Вы хотите при вставке идентификаторов в IN() пункт и эти FIELD() функция в том же порядке.

175
ответ дан Darryl Hein 4 June 2016 в 10:14
поделиться

Два решения, которые приходят на ум:

  1. order by case id when 123 then 1 when 456 then 2 else null end asc

  2. order by instr(','||id||',',',123,456,') asc

(instr() от Oracle; возможно, Вы имеете locate() или charindex() или что-то как этот)

11
ответ дан Jonathan Leffler 4 June 2016 в 10:14
поделиться

В пункте описывает ряд значений, и наборы не имеют порядка.

Ваше решение с соединением и затем заказывающий на display_order столбец является ближе всего правильным решением; что-либо еще - вероятно, определенный для DBMS взлом (или делает некоторый материал с функциями OLAP в стандартном SQL). Конечно, соединение является ближе всего портативным решением (хотя генерируя данные с display_order, значения могут быть проблематичными). Обратите внимание, что Вы, возможно, должны выбрать столбцы упорядочивания; это раньше было требованием в стандартном SQL, хотя я полагаю, что он был ослаблен, как правило, только что (возможно, уже в SQL-92).

4
ответ дан Jonathan Leffler 4 June 2016 в 10:14
поделиться

Моя первая мысль должна была записать единый запрос, но Вы сказали, что это не было возможно, потому что каждый выполняется пользователем, и другой выполняется в фоновом режиме. Как Вы храните список идентификаторов для передачи от пользователя фоновому процессу? Почему бы не помещать их во временную таблицу со столбцом для выражения порядка.

Так как насчет этого:

  1. пользовательский интерфейс укусил выполнения и вставляет значения в новую таблицу, которую Вы составляете. Это вставило бы идентификатор, положение и своего рода идентификатор числа задания)
  2. , число задания передается фоновому процессу (вместо всех идентификаторов)
  3. , фоновый процесс делает выбор из таблицы на шаге 1, и Вы присоединяетесь для получения другой информации, которую Вы запрашиваете. Это использует число задания в операторе Where и заказах столбцом положения.
  4. фоновый процесс, по окончании, удаляет из таблицы на основе идентификатора задания.
1
ответ дан WW. 4 June 2016 в 10:14
поделиться

Дайте этому выстрел:

SELECT name, description, ...
WHERE id IN
    (SELECT id FROM table1 WHERE...)
ORDER BY
    (SELECT display_order FROM table1 WHERE...),
    (SELECT name FROM table1 WHERE...)

то, ГДЕ, вероятно, возьмет немного тонкой настройки для получения связанных подзапросов, работающих правильно, но основной принцип должен быть звуковым.

0
ответ дан chaos 4 June 2016 в 10:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: