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

时间:2010-12-01 12:36:55

标签: php sql oracle sql-order-by oci8

我的这个表有一个'title'字段,它是varchar2,我希望选择所有行,然后按编号排序,然后按字母顺序排序。

例如,我目前最终使用简单的ORDER BY title来获取此内容:

  • ABC
  • 默认值
  • 321

但我想要这个:

  • 321
  • ABC
  • 默认值

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

2 个答案:

答案 0 :(得分:12)

不是Oracle专家,但您应该能够在不使用

更改会话的情况下执行此操作
SELECT * FROM my_data SORT by NLSSORT(title,’NLS_SORT=BINARY_AI’)

您可以在其中更改NLS_SORT=以满足您的需求(以下是values的列表)

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

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

答案 1 :(得分:5)

您看到的行为差异可能是因为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