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

标签 sql oracle sorting

我正在尝试使用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 选项。为了能够执行不区分大小写的排序,您有两种选择:

  1. 设置NLS_COMP='ANSI''NLS_SORT=BINARY_CI'CI后缀表示不区分大小写、 session 或系统通过使用 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
    

    结果:

    COL
    ---
    A
    a
    b
    B
    
  2. 使用 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/

相关文章:

sql - 我不断收到错误 "relation [TABLE] does not exist"

mysql - 在 MySQL 中如何查询 1 行中的 2 列?

java - 全新安装 JDBC for Oracle - 不执行

iphone - 从 iOS 应用程序连接到 Oracle

algorithm - 就地进行基数排序 - 尝试了解如何进行

mysql - sql、联合查询

sql - 通过转置减少列数

c# - 具有连接和计数的快速 linq 查询

java - Mongodb:查找嵌入数组中的最低元素

java - 如何使用java从文本文件中删除一行?