我试图对行为VARCHAR2的查询的结果集进行排序。 我尝试过使用:
ORDER BY
UPPER(SERVER_NAME) ASC
但是我得到了不一致的结果,例如:
120157
777555
AKO
a20064
Elilikes
kagan
1200165_DAVID
如您所见,1200165_DAVID最后出现,此外,我尝试使用正则表达式,如下所示:
ORDER BY
(CASE WHEN REGEXP_LIKE(UPPER(SERVER_NAME), '^[0-9]+$') THEN 1 ELSE 2 END) ASC,
UPPER(SERVER_NAME) ASC
但是我得到了相同的结果,我想得到以下结论:
120157
1200165_DAVID
777555
a20064
AKO
Elilikes
kagan
请告知。
答案 0 :(得分:1)
三件事。
首先:为什么1200165_DAVID
出现在120157
后?如果您按字母顺序排序,它应该出现在它之前。
第二次:对您的测试数据运行查询,我得到了正确的结果。因此,我倾向于相信您的查询与您报告的内容不同,或者某处存在其他错误。
第三:您的数据中可能包含谁知道哪些字符。并排选择str
和dump(str)
(或表达式的任何名称;我喜欢在我的测试数据中使用str
)来查看每个字符串中的字符。特别注意那些似乎按顺序排序的那些。
with
inputs ( str ) as (
select '120157' from dual union all
select '777555' from dual union all
select 'AKO' from dual union all
select 'a20064' from dual union all
select 'Elilikes' from dual union all
select 'kagan' from dual union all
select '1200165_DAVID' from dual
)
select str from inputs
order by upper(str);
STR
-------------
1200165_DAVID
120157
777555
a20064
AKO
Elilikes
kagan
7 rows selected.
答案 1 :(得分:0)
评论太长了。
您的数据似乎不是您识别的所有字符。特别是,第一个角色是可疑的。
我建议您运行这样的查询:
select ASCII(SUBSTR(server_name, 1, 1)) as first_char-ascii,
'|' || SUBSTR(server_name, 1, 1) || '|' as first_char,
COUNT(*), min(server_name), max(server_name)
from t
group by SUBSTR(server_name, 1, 1)
order by count(*) asc;
然后你会看到字符串开头实际上是什么字符。我的猜测是你会发现至少一个有趣的角色。然后,您需要修改数据(或查询)以处理该问题。