2016-12-14 2 views
4

У меня есть этот запрос в SQLпорядок сортировки по алфавиту не работает, как ожидалось

SELECT Book FROM Library ORDER BY Book desc 

Мой желаемый сорт

[Expired]Web Publishing Co., Ltd. 
[Expired]sBox Co.,Ltd 
[Expired]mTertainment 
wwww 

но результат показал следующее

wwww 
[Expired]sBox Co.,Ltd 
[Expired]mTertainment 
[Expired]Web Publishing Co., Ltd. 
+3

Вы, кажется, сортировка по имени таблицы ... – JohnHC

+0

жаль, что я напечатал неверно "SELECT Book FROM Library ORDER BY Book desc" –

+3

Ваш наблюдаемый результат не соответствует запросу. –

ответ

7

Я вижу две проблемы здесь с вашим заказом. Во-первых, символ скобки лексиграфически меньше буквенно-цифровых символов, что не согласуется с тем, что вы хотите. Во-вторых, у вас есть проблема чувствительности к регистру с вашими книжными названиями. Это приводит к тому, что sBox появляется больше лексиграфически, чем Web, хотя прежняя буква появляется раньше в алфавите с точки зрения, нечувствительной к регистру.

Одним из способов получения заказа является использование двух условий. Первое условие разделяет названия книг, начиная с буквенно-цифровых заголовков, начиная с символов, подобных скобкам. Второе условие использует регистр, нечувствительный к регистру, по фактическому названию книги.

SELECT Book 
FROM Library 
ORDER BY CASE WHEN REGEXP_LIKE(SUBSTR(Book, 1, 1), '[^A-Za-z0-9]') THEN 0 ELSE 1 END, 
     LOWER(Book) DESC 

На самом деле, возможно, более точный способ справиться с этим было бы проверить, если название книги начинается с какой-либо квадратные скобки этикетке, т.е. ^[.*]:

ORDER BY CASE WHEN REGEXP_LIKE(Book, '^[[].*[]]') THEN 0 ELSE 1 END, 
     LOWER(Book) DESC 
1

вам нужно выбрать «[Истекло] Есть «? Если нет, то возможно решение заменить его:

SELECT REPLACE('[Expired]sBox Co.,Ltd', '[Expired]', '') as book 
FROM dual UNION 
SELECT REPLACE('[Expired]mTertainmentas', '[Expired]', '') as book 
FROM dual UNION 
SELECT 'www' as book FROM dual 
ORDER BY book DESC 

Или как сделал шоу @ Тим, с Regex:

SELECT REGEXP_REPLACE('[xxxa]sBox Co.,Ltd', '^[[].*[]]', '') as book 
FROM dual UNION 
SELECT REGEXP_REPLACE('[xxxb]mTertainment', '^[[].*[]]', '') as book 
FROM dual UNION 
SELECT 'www' as book FROM dual 
ORDER BY book DESC 
Смежные вопросы