Упорядочивание SQL-запроса по определенным значениям поля

У меня есть sql-запрос (с использованием Firebird в качестве СУБД), в котором мне нужно упорядочить результаты по полю EDITION. Однако мне нужно упорядочить по содержимому поля. то есть «NE» идет первым, «OE» идет вторым, «OP» идет третьим, а пробелы идут последними. К сожалению, я понятия не имею, как это можно сделать. Все, что я когда-либо делал, это ORDER BY [FIELD] ASC / DESC и ничего больше.

Какие-либо предложения?

Изменить: я действительно должен уточнить: я просто надеялся узнать больше здесь. Теперь у меня есть несколько операторов выбора, определяющих, какие из них показывать в первую очередь. Запрос довольно большой, и я действительно надеялся узнать, возможно, более эффективный способ сделать это: пример:

SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='NE'
UNION 
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OE'
UNION
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OP'
UNION (etc...)

person Cyprus106    schedule 29.12.2008    source источник
comment
Ни одно из предложенных решений не требует множественного выбора / объединения. Все они должны быть намного быстрее и проще в обслуживании, а запрос будет НАМНОГО легче читать.   -  person Peter T. LaComb Jr.    schedule 29.12.2008
comment
Я собираюсь с Питером ЛаКомбом на этом. Почему вы используете СОЮЗЫ? Нет необходимости, я бы выбрал SELECT * FROM Retail WHERE MTITLE LIKE 'somethi%' AND EDITION IN ('NE', 'OE', 'OP', '') ORD BY CASE EDITION Когда 'NE' Тогда 1 Когда «OE», затем 2, когда «OP», затем 3, иначе 4, конец   -  person Pulsehead    schedule 30.12.2008
comment
@Pulsehead, вы можете найти ответ на вопрос, почему я бы использовал объединения где-то в этом самом вопросе StackOverflow о том, что не знаете, как лучше всего упорядочить поля.   -  person Cyprus106    schedule 09.12.2015


Ответы (8)


Добавьте эти значения в другую таблицу с числовым столбцом для их ранга:

Edition  Rank
NE       1
OE       2
OP       3

Присоединитесь к таблицам и выполните сортировку по полю RANK.

person Peter T. LaComb Jr.    schedule 29.12.2008
comment
Точно. Если это не постоянная потребность или часто меняется, тогда OP может использовать временную таблицу / переменную таблицы. - person StingyJack; 29.12.2008

Пытаться:

select *
from MyTable
order by
case [FIELD] 
    when 'NE' then 1
    when 'OE' then 2
    when 'OP' then 3
    when '' then 4
    else 5
end
person D'Arcy Rittich    schedule 29.12.2008

Попробуй это:

ORDER BY FIND_IN_SET(EDITION, 'NE,OE,OP,')
person user49953    schedule 29.12.2008
comment
FIND_IN_SET () не работает в SQL Server 2005. Вы можете сказать мне, как вы это сделали? У меня есть kludge-решение, но я всегда ищу более элегантное решение. - person Pulsehead; 29.12.2008

Как насчет этого?

SELECT * 
FROM RETAIL
WHERE MTITLE LIKE 'somethi%'
ORDER BY POSITION(EDITION, ' OP OE NE') DESC

Если substr - пустая строка, результатом будет 1. Если совпадения не найдено, результатом будет 0.

Позиция()

Добавлено в Firebird 2.1

ссылка: https://firebirdsql.org/refdocs/langrefupd21-intfunc-position.html < / а>

person H.He    schedule 17.08.2018

person    schedule
comment
OOH! Более рационально, чем я. Придется запомнить ваше решение. - person Pulsehead; 29.12.2008
comment
В самом деле - я раньше не видел такого синтаксиса. - person Peter T. LaComb Jr.; 29.12.2008

person    schedule
comment
Спасибо. Приятно знать, что другие используют этот хак / кладж! заставляет меня чувствовать себя лучше программистом / dba. - person Pulsehead; 29.12.2008
comment
К тому времени, когда я начал заказ, SO предупредил меня о трех ответах. - person KP.; 29.12.2008
comment
Действительно ли псевдоним Sequence - хорошая идея? Может ли он не конфликтовать с зарезервированными словами на некоторых серверах SQL? Например, в Firebird появился новый синтаксис CREATE SEQUENCE ... - person mghie; 30.12.2008
comment
Я лично не знаком с Firebird. Я использую диспетчер предприятия SQL Server 2005. Но если Sequence у вас не работает, можно использовать Order By. На самом деле, думаю, я отредактирую ответ. - person Pulsehead; 30.12.2008

person    schedule
comment
Для создания таблиц де-факто потребуется монопольный доступ к базе данных, иначе рано или поздно два пользователя столкнутся, создавая ее одновременно. Кроме того, если сетевое соединение разрывается, или происходит сбой клиентского приложения или даже сбой сервера - тогда эта таблица, вероятно, остается в базе данных - и вы не проверяете это условие перед попыткой его создания. - person Arioch 'The; 14.01.2019

person    schedule
comment
Объясните, пожалуйста, что вы там делали. - person m1k1o; 05.06.2019