Выборочная сортировка в порядке SQL по предложению? - PullRequest
8 голосов
/ 23 октября 2011

Вот ситуация, которую я пытаюсь решить:

У меня есть запрос, который может вернуть набор записей.Поле, по которому можно отсортировать, может иметь несколько различных значений - ради этого вопроса мы скажем, что значение может быть A, B, C, D, E или Z

Теперь в зависимости от результатовВ запросе сортировка должна вести себя следующим образом: если найдены только записи AE, то сортировка их «естественно» - это нормально.Но если в результатах присутствует запись Z, то это должен быть первый результат в запросе, а остальные записи должны быть в «естественном» порядке сортировки.

Например, если найдены ACD, тогда результат должен быть

A
C
D

Но если ABDEZ найден, результат должен быть отсортирован:

Z
A
B
D
E

В настоящее время запрос выглядит так:

SELECT NAME, SOME_OTHER_FIELDS FROM TABLE ORDER BY NAME

Я знаю, что могу кодировать функцию сортировки, чтобы делать то, что я хочу, но из-за того, как я использую результаты, я не могу использовать их, потому что результаты обрабатываются сторонней библиотекой, для которой я простопрохождение запроса SQL.Затем он обрабатывает результаты, и у меня, похоже, нет никаких ловушек для сортировки результатов и просто передачи результатов в библиотеку.Он должен выполнять сам SQL-запрос, и у меня нет доступа к исходному коду библиотеки.

Так что для всех вас, гуру SQL, можете ли вы предоставить мне запрос, который будет делать то, что яхотите?

Ответы [ 3 ]

35 голосов
/ 23 октября 2011

Как вы идентифицируете запись Z? Что отличает это? Как только вы это поймете, добавьте его в предложение ORDER BY.

SELECT name, *
FROM [table]
WHERE (x)
ORDER BY
    (
     CASE
       WHEN (record matches Z) THEN 0
       ELSE 1
     END
    ),
    name

Таким образом, только запись Z будет соответствовать первому порядку, а все остальные записи будут отсортированы по сортировке (имени) второго порядка. Вы можете исключить сортировку второго порядка, если она вам действительно не нужна.

Например, если Z является символьной строкой 'Bob', ваш запрос может быть:

SELECT name, *
FROM [table]
WHERE (x)
ORDER BY
    (
     CASE
       WHEN name='Bob' THEN 0
       ELSE 1
     END
    ), name

Мои примеры приведены для T-SQL, поскольку вы не упомянули, какую базу данных вы используете.

2 голосов
/ 23 октября 2011

Существует несколько способов решения этой проблемы, и наилучшее решение зависит от ряда факторов, которые вы не обсуждаете, таких как природа этих значений A..Z и какой продукт базы данных вы используете.

Если у вас есть только одно значение, которое нужно отсортировать сверху, вы можете ORDER BY выражение, которое отображает это значение на минимально возможное значение сортировки (с CASE или IIF или IFEQ,в зависимости от вашей базы данных).

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

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

1 голос
/ 23 октября 2011

Не уверен, какую БД вы используете - для Oracle работает следующее:

SELECT 
NAME, 
SOME_OTHER_FIELDS, 
DECODE (NAME, 'Z', '_', NAME ) SORTFIELD 
FROM TABLE 
ORDER BY DECODE (NAME, 'Z', '_', NAME ) ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...