Ответ 1
Order By Case Edition
When 'NE' Then 1
When 'OE' Then 2
When 'OP' Then 3
Else 4 End
У меня есть запрос 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...)
Order By Case Edition
When 'NE' Then 1
When 'OE' Then 2
When 'OP' Then 3
Else 4 End
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*/
Добавьте эти значения в другую таблицу с числовым столбцом для их ранга:
Edition Rank
NE 1
OE 2
OP 3
Присоединитесь к таблицам и выполните сортировку в поле RANK.
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
Попробуйте следующее:
ORDER BY FIND_IN_SET(EDITION, 'NE,OE,OP,')
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
Как насчет этого?
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
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
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