порядок 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 60

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 заявление. Кроме того, вы можете использовать средние имена значений-ваше реальное приложение, вероятно, делает и вы просто замаскировали их для конфиденциальности-без лишнего места, так как хранится только порядковая позиция.

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