2016-12-14 203 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 

或者像@Tim的確表明,與正則表達式:

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