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