按desc排序顺序不按预期工作

时间:2016-12-14 10:23:02

标签: sql oracle oracle11g sql-order-by

我在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.

2 个答案:

答案 0 :(得分:7)

我在这里看到了两个问题。首先,括号符号在词典上小于字母数字字符,这与您想要的不一致。其次,您的图书标题存在区分大小写问题。这导致sBox出现更大 lexigraphically而不是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 :(得分: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一样用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