我有一个用户表,其中我的列名为varchar2
的列名。当我执行带有order by子句的简单select语句时,如下所示:
select * from Loginuser order by firstname
我以正确的订单格式获得结果。姓名从A
开始,并继续按顺序排列,但最后3条记录与此条件不符。
如果我查看姓氏如下的最后6条记录:
Ying
Yogen
Yvet
alo
pal
Ângelo
所以我不知道最后三条记录有什么问题?
答案 0 :(得分:4)
最后三条记录出了什么问题?
ORDER BY
/ CHAR
列上的 VARCHAR2
将按连续字符的字符代码排序。
查询1 :
SELECT firstname,
ASCII( firstname ),
DUMP( firstname )
FROM loginuser
<强> Results 强>:
| FIRSTNAME | ASCII(FIRSTNAME) | DUMP(FIRSTNAME) |
|-----------|------------------|------------------------------------------|
| Ying | 89 | Typ=1 Len=4: 89,105,110,103 |
| Yogen | 89 | Typ=1 Len=5: 89,111,103,101,110 |
| Yvet | 89 | Typ=1 Len=4: 89,118,101,116 |
| alo | 97 | Typ=1 Len=3: 97,108,111 |
| pal | 112 | Typ=1 Len=3: 112,97,108 |
| Ângelo | 50050 | Typ=1 Len=7: 195,130,110,103,101,108,111 |
在ASCII
列中,您可以看到Y
的字符代码为89,a
为97
,p
为112且{{ 1}}是一个2字节的unicode字符50050(或字节195和130),它们按字符代码的升序排序。
另一种解决方案是使用Â
和CONVERT
或UPPER
:
查询2 :
LOWER
<强> Results 强>:
SELECT firstname,
UPPER( CONVERT( firstname, 'US7ASCII' ) )
FROM loginuser
ORDER BY UPPER( CONVERT( firstname, 'US7ASCII' ) )
答案 1 :(得分:2)
您可以尝试使用ORDER BY
以及二进制排序规则:
SELECT *
FROM Loginuser
ORDER BY NLSSORT(firstname, 'NLS_SORT=BINARY_AI')
来自Oracle documentation:
BINARY_AI表示不区分重音且不区分大小写的二进制排序。