我正在尝试使用COLLATE NOCASE
按字母顺序排序不区分大小写
但出现错误
ORA - 00933 SQL command not properly ended.
下面是我正在触发的查询:
SELECT LPN.LPN_ID,
LPN.TC_ORDER_ID,
ORDERS.D_NAME,
ORDERS.PURCHASE_ORDER_NUMBER AS ORDER_PURCHASE_ORDER_NUMBER,
ORDERS.D_NAME AS D_NAME_2, LPN.LPN_NBR_X_OF_Y
FROM ORDERS ORDERS,
LPN LPN
WHERE ORDERS.ORDER_ID=LPN.ORDER_ID
ORDER BY ORDERS.D_NAME COLLATE NOCASE DESC
我在这里检查尝试这个但仍然出现错误 How to use SQL Order By statement to sort results case insensitive? 请问有什么建议吗?
最佳答案
Oracle 不支持 order by
子句的 COLLATE NOCASE
选项。为了能够执行不区分大小写的排序,您有两种选择:
设置
NLS_COMP='ANSI'
和'NLS_SORT=BINARY_CI'
,CI
后缀表示不区分大小写、 session 或系统通过使用alter session
或alter system
语句进行宽范围:alter session set nls_comp='ANSI'; alter session set nls_sort='BINARY_CI'; with t1(col) as( select 'A' from dual union all select 'a' from dual union all select 'b' from dual union all select 'B' from dual ) select * from t1 order by col
结果:
COL --- A a b B
使用
upper()
或lower()
函数更改字 rune 字的大小写。with t1(col) as( select 'A' from dual union all select 'a' from dual union all select 'b' from dual union all select 'B' from dual ) select * from t1 order by upper(col)
结果:
COL --- A a b B
编辑
but i need the UpperCase to preceed any LowerCase eg. Alan, alan, Brian, brian, Cris
这不是不区分大小写的排序,在某种意义上相当相反。作为选项之一,您可以执行以下操作来产生所需的结果:
with t1(col) as(
select 'alan' from dual union all
select 'Alan' from dual union all
select 'brian' from dual union all
select 'Brian' from dual union all
select 'Cris' from dual
)
select col
from ( select col
, case
when row_number() over(partition by lower(col)
order by col) = 1
then 1
else 0
end as rn_grp
from t1
)
order by sum(rn_grp) over(order by lower(col))
结果:
COL
-----
Alan
alan
Brian
brian
Cris
关于sql - 如何使用 COLLATE NOCASE 按不区分大小写的字母顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19375330/