2015-06-16 2 views
2
select HId, TestM, * 
from TestDb 
where Hid in (4, 5, 7, 9, 1, 132, 312) 

Если я запустил указанный выше .sql-файл, первый столбец будет отсортирован по возрастанию по умолчанию.Отключить заказ по sql-запросу

Я хочу, чтобы столбец HID находился в порядке значений внутри предложения where. Как я могу это достичь?

Hid | TestM | ... 
_______________ 
4 

5 

7 

9 

1 

132 

312 
+4

необходимо создать колонку для заказа. нет сортировки по умолчанию, поскольку SQL не гарантированно возвращает результаты в последовательном порядке без предложения order by. – Jeremy

ответ

6

Вы должны использовать выражение CASE в ORDER BY пункте:

SELECT HId, TestM, * 
FROM TestDb 
WHEN Hid IN (4, 5, 7, 9, 1, 132, 312) 
ORDER BY CASE Hid 
      WHEN 4 THEN 1 
      WHEN 5 THEN 2 
      WHEN 7 THEN 3 
      WHEN 9 THEN 4 
      WHEN 1 THEN 5 
      WHEN 132 THEN 6 
      WHEN 312 THEN 7 
     END 

Также отметим, что таблицы только неупорядоченные наборы, поэтому если оставить пункт ORDER BY вне, то нет гарантировано заказ для вашего результирующего набора.

+0

В моей статье, где у меня есть значения> 3k внутри (...) –

+0

@FlorinM. В этом случае я боюсь, что нет простой альтернативы вышеизложенному. Вы должны как-то указать порядок для каждого отдельного значения предложения 'IN'. Вы можете сохранить эту информацию в таблице, а затем 'JOIN', но информация должна быть где-то, чтобы вы могли ее использовать. –

1

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

Часто используемый подход заключается в использовании сазе, но это может стать неуклюжим ...

ORDER BY 
    CASE HId WHEN 4 THEN 1 
      WHEN 5 THEN 2 
      WHEN 7 THEN 3 
      WHEN 8 THEN 4 
      WHEN 1 THEN 5 
      WHEN 123 THEN 6 
      WHEN 312 THEN 7 END 

Альтернативой является РЕГИСТРИРУЙТЕСЬ на таблицу, которая включает в себя как значения вы фильтрации с помощью и для сортировки. Это немного менее неуклюжий, более реляционный и немного легче расширить ...

SELECT 
    TestDB.HId, TestDB.TestM, TestDB.* 
FROM 
    TestDB 
INNER JOIN 
(
       SELECT 4 AS val, 1 AS ordinal 
    UNION ALL SELECT 5 AS val, 2 AS ordinal 
    UNION ALL SELECT 7 AS val, 3 AS ordinal 
    UNION ALL SELECT 8 AS val, 4 AS ordinal 
    UNION ALL SELECT 1 AS val, 5 AS ordinal 
    UNION ALL SELECT 132 AS val, 6 AS ordinal 
    UNION ALL SELECT 312 AS val, 7 AS ordinal 
) 
    filter 
     ON filter.value = TestDB.HId 
ORDER BY 
    filter.ordinal 
Смежные вопросы