Упорядочивание SQL-запроса по определенным значениям поля - PullRequest
15 голосов
/ 29 декабря 2008

У меня есть SQL-запрос (с использованием Firebird в качестве СУБД), в котором мне нужно упорядочить результаты по полю, EDITION. Мне нужно заказать по содержимому поля, однако. т.е. «NE» идет первым, «OE» идет вторым, «OP» идет третьим, а пробелы идут последним. К сожалению, я понятия не имею, как это можно сделать. Все, что я когда-либо делал, это ПОРЯДОК [ПОЛЯ] 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...)

Ответы [ 9 ]

49 голосов
/ 29 декабря 2008
Order By Case Edition
    When 'NE' Then 1
    When 'OE' Then 2
    When 'OP' Then 3
    Else 4 End 
6 голосов
/ 29 декабря 2008
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*/
5 голосов
/ 29 декабря 2008

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

Edition  Rank
NE       1
OE       2
OP       3

Объединить таблицы и отсортировать по полю RANK.

2 голосов
/ 29 декабря 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
0 голосов
/ 05 июня 2019
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
0 голосов
/ 14 января 2019
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
0 голосов
/ 17 августа 2018

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

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

0 голосов
/ 02 декабря 2015
    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
0 голосов
/ 29 декабря 2008

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

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