Стандартный SQL
Попробуйте оператор CASE
в ORDER BY
:
SELECT npID, title, URL, issue
FROM tbl
ORDER BY substring(issue, 1, 4) DESC
,CASE
WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter') THEN 1
WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2
WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter') THEN 3
WHEN substring(issue, 6, 100) IN ('Fall', 'Fourth Quarter') THEN 4
ELSE 5
END;
Не спрашивайте, почему Winter -> Summer -> Spring
- это то, чтоклиент хочет!:)
Оптимизация производительности
"Простой" CASE должен работать лучше, поскольку выражение вычисляется только один раз.
И right(issue, -5)
эквивалентно substring(issue, 6, 100)
, но немного быстрее:
SELECT npid, title, url, issue
FROM tbl
ORDER BY left(issue, 4) DESC
,CASE right(issue, -5)
WHEN 'Winter' THEN 1
WHEN 'First_Quarter' THEN 1
WHEN 'Summer' THEN 2
WHEN 'Second_Quarter' THEN 2
WHEN 'Spring' THEN 3
WHEN 'Third_Quarter' THEN 3
WHEN 'Fall' THEN 4
WHEN 'Fourth Quarter' THEN 4
ELSE 5
END;
left()
и right()
были добавлены в PostgreSQL 9.1.Хитрость с right()
состоит в том, чтобы использовать отрицательное число для обрезки постоянного числа символов слева.
Варианты синтаксиса
Они эквивалентны (для строк<= 100 символов): </p>
SELECT substring(issue from 6 for 100) AS substring1
,substring(issue, 6, 100) AS substring2
,substring(issue, 6) AS substring3
,substr(issue, 6, 100) AS substr1
,substr(issue, 6) AS substr2
,right(issue, -5) AS right0
FROM tbl
-> sqlfiddle