порядок sql по нескольким значениям в определенном порядке?
Ок, у меня есть таблица с проиндексированных и не проиндексированных полей. Мне нужно найти все записи с определенным значением и возвращает строку. Я хотел бы знать, могу ли я заказать по нескольким значениям.
пример:
id x_field
-- -----
123 a
124 a
125 a
126 b
127 f
128 b
129 a
130 x
131 x
132 b
133 p
134 p
135 i
псевдо: хотелось бы, чтобы результаты были упорядочены следующим образом,where ORDER BY x_field = 'f', 'p', 'i', 'a'
SELECT *
FROM table
WHERE id NOT IN (126)
ORDER BY x_field 'f', 'p', 'i', 'a'
так что результаты будут:
id x_field
-- -----
127 f
133 p
134 p
135 i
123 a
124 a
125 a
129 a
синтаксис допустим, но когда я выполняю запрос, он никогда не возвращает никаких результатов, даже если я ограничиваю его 1 запись. Есть ли другой способ сделать это?
подумайте о x_field как о результатах теста, и мне нужно проверить все записи, которые попадают в состояние. Я хотел упорядочить результаты теста по неудачным значениям, переданным значениям. Поэтому я мог сначала проверить неудачные значения, а затем переданные значения, используя ORDER BY.
что я не могу сделать:
- GROUP BY, так как мне нужно вернуть конкретные значения записи
- где x_field IN ('f', 'p', 'i', "а"), мне нужны все значения, как я пытаюсь использовать один запрос для нескольких проверок. И значения x_field не находятся в порядке DESC/ASC
после написания этого вопроса я начинаю думать, что мне нужно переосмыслить это, лол!
6 ответов:
... WHERE x_field IN ('f', 'p', 'i', 'a') ... ORDER BY CASE x_field WHEN 'f' THEN 1 WHEN 'p' THEN 2 WHEN 'i' THEN 3 WHEN 'a' THEN 4 ELSE 5 --needed only is no IN clause above. eg when = 'b' END, id
вы можете использовать левое соединение с "значениями ('f',1),('p',2),('a',3),('i',4)" и использовать второй столбец в вашем порядке-по выражению. Postgres будет использовать хэш-соединение, которое будет намного быстрее, чем огромный случай, если у вас много значений. И это легче для автогенерации.
Если эта информация о заказе фиксирована, то она должна иметь свою собственную таблицу.
попробуй:
ORDER BY x_field='F', x_field='P', x_field='A', x_field='I'
Вы были на правильном пути, но, поставив x_field только на значение F, остальные 3 рассматривались как константы и не сравнивались ни с чем в наборе данных.
использовать
case
переключатель для перевода кодов в числа, которые могут быть отсортированы:ORDER BY case x_field when 'f' then 1 when 'p' then 2 when 'i' then 3 when 'a' then 4 else 5 end
The
CASE
иORDER BY
предложения должны все работать, но я хочу предложить другой коленкор. Предполагая, что существует только разумное количество значений дляx_field
и вы уже знаете, что они создают перечисляемого типа С F, P, A и I в качестве значений (плюс любые другие возможные значения применяются). Перечисления будут отсортированы в порядке, подразумеваемом ихCREATE
заявление. Кроме того, вы можете использовать средние имена значений-ваше реальное приложение, вероятно, делает и вы просто замаскировали их для конфиденциальности-без лишнего места, так как хранится только порядковая позиция.