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

z8dt9xmd  于 2023-08-03  发布在  Oracle
关注(0)|答案(2)|浏览(106)

我有一个“标题”字段varchar2的这个表,我想选择所有行,并按数字排序,然后按字母表排序,因为它通常发生。
例如,我目前使用一个简单的ORDER BY title来得到这个:

  • ABC
  • Def
  • 321

但我想要这个

  • 321
  • ABC
  • Def

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

dwbf0jvd

dwbf0jvd1#

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

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

字符串
您可以在其中更改NLS_SORT=以满足您的需要(以下是值列表)
请记住,docs说这将强制表扫描,所以首先过滤它们可能是有益的(但如果您选择所有表扫描,则无论如何都将使用表扫描)。
SQL Developer表现出不同行为的原因可能是因为它更改了会话。
也可以在整个会话中更改此设置:

alter session set nls_sort=binary;

rbl8hiat

rbl8hiat2#

您看到的行为差异可能是由于不同的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

相关问题