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