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

Sql 如何在不同情况下按表列排序(Oracle),sql,oracle,select,sql-order-by,case-sensitive,Sql,Oracle,Select,Sql Order By,Case Sensitive,如何对一个包含varchar2列的表进行排序,该列具有不同大小写的字符(上限和下限) 例如,当我对“名称”列进行排序时,会得到以下结果: ANNIE BOB Daniel annie bob 我想要的是这样的东西: ANNIE annie BOB bob Daniel 使用下部(字段),例如 select * from tbl order by lower(name) 如果您需要解决非英语语言的特殊字符,那么关于NLSSORT的其他答案可能就是您所需要的。如果您不知道,我会尝试亲吻并使用l

如何对一个包含varchar2列的表进行排序,该列具有不同大小写的字符(上限下限

例如,当我对“名称”列进行排序时,会得到以下结果:

ANNIE
BOB
Daniel
annie
bob
我想要的是这样的东西:

ANNIE
annie
BOB
bob
Daniel
使用
下部(字段)
,例如

select * from tbl order by lower(name)

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

如果您使用的是相对较新的Oracle版本,您应该考虑设置NLS_SORT/NLS_COMP,而不是使用lower()函数

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

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

这方面的一个很好的例子是

另一个选项是使用该功能执行:

优点是更灵活。人们可以用重音和不同的大小写对字符进行排序。人们可以选择用特定于语言的方式来处理某些字符。在一组等效字符中定义顺序。所以“A”和“A”被排序在一起,但在“A”中,大写字母排在第一位。缺点我希望NLSSORT使用更多的CPU而不是更低的CPU,尽管我还没有对其进行基准测试。NLSSORT将只使用以下前缀:

返回的字符串(也称为排序规则键)是原始数据 类型。由给定字符生成的排序规则键的长度 给定排序规则的值可能超过2000字节,这是 NLSSORT返回的原始值的最大长度。在这种情况下,, NLSSORT计算最大前缀或初始值的排序规则键 子字符串,以使计算结果不超过2000 字节。对于单语排序规则,例如法语,前缀 长度通常为1000个字符。对于多语言排序规则,对于 例如,前缀通常为500个字符。确切的 长度可能较低或较高,具体取决于排序规则和 字符中包含的字符


您可以使用“按cluse订购”进行此操作

select col_name from table_name 
order by col_name ;

您可以使用
INITCAP

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

需要补充的一点是,这意味着除非在
lower(name)
上有功能索引,否则将使用此查询执行完整表扫描。此查询将始终需要完整表扫描,包括或不包括ORDER BY。通常,您描述的问题在WHERE子句中更为重要。@DCookie:您想下注吗?;)e、 g.在
lower(name)
上尝试一个函数索引,附加表中的所有列=完整索引扫描,加上不排序:)-只需说“不要学究气,但
UPPER()
将是实现这一点的规范的教科书式方法。如果基于函数的索引已存在或将存在,则您更可能在
UPPER()
上找到它,而不是
LOWER()
。设置NLS\u SORT/NLS\u COMP将更改所有查询的行为。如果这是一个人想要的,那就太好了。如果不是的话就不太好。不一定。我将返回并编辑我的示例来演示。NLSSORT和NLS_SORT都是由Oracle定义的,但它们是不同的东西。这个答案的顶部引用了NLS_SORT,一个参数。但是,在我注释后添加的代码使用NLSSORT函数。因此,如果你最初的意思是NLSSORT,你是正确的,我的评论将不适用。NLSSORT,NLS_排序我链接的文章涵盖了这两个方面。如果你不喜欢我的答案,你可以投票否决。有关使用索引进行语言排序的信息,请参阅。没有理由提供一个不优于公认答案的答案。此外,initcap不会这样做(考虑‘ANNA’和‘annie’)。
SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC;