如何在不同情况下按表列排序(Oracle)

时间:2012-03-20 14:35:09

标签: sql oracle select sql-order-by case-sensitive

如何使用varchar2列对表格进行排序,其中包含不同情况下的字符( UPPER lower )?

例如,当我按名称列进行订单时,我得到以下结果:

ANNIE
BOB
Daniel
annie
bob

我想要的是这样的:

ANNIE
annie
BOB
bob
Daniel

5 个答案:

答案 0 :(得分:36)

使用lower(field),例如

select * from tbl order by lower(name)

如果你需要解决非英语语言的特殊字符,那么关于NLSSORT的其他答案可能就是你所需要的。如果你不这样做,我会尝试并使用lower(),因为它很容易记住和使用,并被其他人阅读(可维护性)。

答案 1 :(得分:12)

另一个选择是使用NLSSORT函数来执行linguistic sorting

SQL> with test as (select 'ANNIE' as col from dual
  2      union all select 'BOB' from dual
  3      union all select 'Daniel' from dual
  4      union all select 'annie' from dual
  5      union all select 'bob' from dual
  6      union all select 'Ångström' from dual
  7      union all select 'ångström' from dual)
  8  select col
  9  from test
 10  order by nlssort(col, 'NLS_SORT = WEST_EUROPEAN')
 11  /

COL
----------
Ångström
ångström
ANNIE
annie
BOB
bob
Daniel

优点是更灵活。人们可以将带有重音符号的字符和不同的情况一起排序。可以选择specifying different values for NLS_SORT以特定语言的方式处理某些字符。定义等效字符集中的顺序。因此'A'和'a'被排序在一起,但在'a'中,大写首先出现。缺点我希望NLSSORT使用比LOWER更多的CPU,尽管我没有标记它。 NLSSORT只使用前缀longer strings

  

返回的字符串(也称为校对键)是RAW数据   类型。由给定char产生的归类键的长度   给定排序规则的值可能超过2000个字节,即   NLSSORT返回的RAW值的最大长度。在这种情况下,   NLSSORT计算最大前缀或初始值的排序规则键   char的子字符串,以便计算结果不超过2000   字节。对于单语校对,例如FRENCH,前缀   长度通常为1000个字符。对于多语言整理,   例如GENERIC_M,前缀通常为500个字符。最正确   长度可以更低或更高,取决于整理和   char中包含的字符。

答案 2 :(得分:7)

如果您使用的是相对较新版本的Oracle,则应该查看设置NLS_SORT / NLS_COMP,而不是使用LOWER()函数。

如果您不想全局影响该实例,可以使用NLSSORT()函数为特定查询的范围设置NLS_SORT。

SQL> create table case_insensitive(a varchar2(10));

Table created.

SQL> insert into case_insensitive values('D');

1 row created.

SQL> 
SQL> 
SQL> c/'D/'c
  1* insert into case_insensitive values('c')
SQL> /

1 row created.

SQL> c/'c/'B
  1* insert into case_insensitive values('B')
SQL> /

1 row created.

SQL> c/'B/'a
  1* insert into case_insensitive values('a')
SQL> /

1 row created.

SQL> commit;

Commit complete.

SQL> select * from case_insensitive;

A
----------
D
c
B
a

SQL> select * from case_insensitive order by a;

A
----------
B
D
a
c

SQL> select * from case_insensitive order by nlssort(a,'NLS_SORT=BINARY_CI'); 

A
----------
a
B
c
D

可以找到一个很好的例子here.

答案 3 :(得分:0)

您可以使用INITCAP例如

SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC;

答案 4 :(得分:-2)

您可以使用cluse命令

select col_name from table_name 
order by col_name ;