如何使用COLLATE NOCASE按不区分大小写的字母顺序排序

mad*_*ddy 5 sql sorting oracle

我试图按字母顺序排序不区分大小写COLLATE NOCASE 但使用错误

ORA - 00933 SQL命令未正确结束.

下面是我要解雇的查询:

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
Run Code Online (Sandbox Code Playgroud)

我在这里检查尝试这个但仍然得到错误 如何使用SQL Order By语句对结果进行排序不区分大小写? 有什么建议吗?

Nic*_*nov 6

Oracle不支持COLLATE NOCASEorder by子句的选项.为了能够执行不区分大小写的排序,您有两种选择:

  1. 设置NLS_COMP='ANSI''NLS_SORT=BINARY_CI',CI后缀使用宽是指不区分大小写,会话或系统alter sessionalter 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
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    COL
    ---
    A
    a
    b
    B
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用upper()或者lower()函数更改字符文字的大小写.

      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)
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    COL
    ---
     A
     a
     b
     B
    
    Run Code Online (Sandbox Code Playgroud)

编辑

但我需要UpperCase优先于任何LowerCase,例如.艾伦,艾伦,布赖恩,布莱恩,克里斯

这不是不区分大小写的顺序,而是在某种意义上相反.作为其中一个选项,您可以执行以下操作以产生所需的结果:

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))
Run Code Online (Sandbox Code Playgroud)

结果:

COL
-----
Alan
alan
Brian
brian
Cris
Run Code Online (Sandbox Code Playgroud)