如何使用 Oracle SQL 查询先按数字排序?

Posted

技术标签:

【中文标题】如何使用 Oracle SQL 查询先按数字排序?【英文标题】:How to sort by numbers first with Oracle SQL query? 【发布时间】:2011-05-18 11:41:39 【问题描述】:

我有一个带有 varchar2 的“标题”字段的表,我想选择所有行并首先按数字排序,然后按通常发生的字母排序。

例如,我目前最后使用简单的ORDER BY title 得到这个:

Abc 默认 321

但我想要这个:

321 Abc 默认

奇怪的是,SQL Developer 显示“正确”的顺序,数字在前。但在我的应用程序(使用 OCI8 的 php)上,它最后显示数字。

【问题讨论】:

【参考方案1】:

不是 Oracle 专家,但您应该能够在不更改会话的情况下使用

SELECT * FROM my_data SORT by NLSSORT(title,’NLS_SORT=BINARY_AI’)

您可以在哪里更改NLS_SORT= 以满足您的需求(这里是values 的列表)

请记住,文档说这将强制进行表扫描,因此首先过滤它们可能是有益的(但如果您选择所有表扫描,那么无论如何您都将使用)。

SQL Developer 表现出不同行为的原因可能是因为它改变了会话。

【讨论】:

按 NLSSORT 排序(标题,'NLS_SORT=BINARY_AI')【参考方案2】:

您看到的行为差异可能是由于不同的 NLS_SORT 参数设置。考虑:

SQL> select * from nls_session_parameters where parameter='NLS_SORT';

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_SORT                       BINARY

SQL> SELECT * FROM my_data order by title;

TITLE
-----
321
Abc
Def

SQL> alter session set nls_sort=french;

Session altered

SQL> SELECT * FROM my_data order by title;

TITLE
-----
Abc
Def
321

无论您的NLS_SORT 会话参数设置如何,您都可以构建一个应为您提供预期结果的查询,例如:

SQL> SELECT *
  2    FROM my_data
  3   ORDER BY CASE
  4               WHEN regexp_like(title, '[0-9]+\.?[0-9]*') THEN
  5                1
  6               ELSE
  7                2
  8            END, title;

TITLE
-----
321
Abc
Def

【讨论】:

以上是关于如何使用 Oracle SQL 查询先按数字排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何先按搜索词排序查询结果,然后按字母顺序?

如何使用子查询和 wm_concat 对 Oracle SQL 中的数据进行排序

Oracle:如何在 SQL 查询中实现“自然”排序?

sql 分组排序

oracle如何定位效率较低的sql

在 Oracle SQL 中使用“Fetch First”后如何对行进行排序?