Подтвердить что ты не робот

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

У меня есть запрос sql (с использованием Firebird как RDBMS), в котором мне нужно заказать результаты по полю 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...)
4b9b3361

Ответ 1

Order By Case Edition
    When 'NE' Then 1
    When 'OE' Then 2
    When 'OP' Then 3
    Else 4 End 

Ответ 2

SELECT 
  /*other fields*/
  CASE WHEN 'NE' THEN 1
    WHEN "OE" THEN 2
    WHEN "OP" THEN 3
    ELSE 4
END AS OrderBy
FROM
  /*Tables*/
WHERE
  /*conditions*/
ORDER BY
  OrderBy,
  /*other fields*/

Ответ 3

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

Edition  Rank
NE       1
OE       2
OP       3

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

Ответ 4

Try:

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

Ответ 5

Попробуйте следующее:

ORDER BY FIND_IN_SET(EDITION, 'NE,OE,OP,')

Ответ 6

    CREATE TABLE #TMP
(
       ID INT IDENTITY(1,1),
       NAME VARCHAR(100),
)

INSERT INTO #TMP
SELECT 'ASHISH'
UNION ALL
SELECT 'CHANDAN'
UNION ALL
SELECT 'DILIP'
UNION ALL
SELECT 'ESHA'
UNION ALL
SELECT 'FIZA'
UNION ALL
SELECT 'MAHESH'
UNION ALL
SELECT 'VIPUL'
UNION ALL
SELECT 'ANIL'

-- I want to sort NAME column from value 'DILIP' then query will be as bellow

SELECT * FROM #TMP ORDER BY CASE WHEN NAME='DILIP' THEN '1' ELSE NAME END ASC

DROP TABLE #TMP

Ответ 7

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

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

Ответ 8

SELECT * FROM (

SELECT 1 as Rank, R.* FROM RETAIL R WHERE MTITLE LIKE 'somethi%' AND EDITION='NE'
   UNION ALL
SELECT 2 as Rank, R.* FROM RETAIL R WHERE MTITLE LIKE 'somethi%' AND EDITION='OE'
   UNION ALL
SELECT 3 as Rank, R.* FROM RETAIL R WHERE MTITLE LIKE 'somethi%' AND EDITION='OP'
   UNION ALL (etc...)

) ORDER BY 1

Ответ 9

SELECT (CASE WHEN 'NE' THEN 1
    WHEN "OE" THEN 2
    WHEN "OP" THEN 3
    ELSE 4) as orden,* FROM Retail WHERE MTITLE LIKE 'somethi%' 
     AND EDITION IN ('NE', 'OE', 'OP', '') ORDER BY Orden