11

このテーブルには varchar2 である「タイトル」フィールドがあり、すべての行を選択して、最初に番号で並べ替え、次に通常のようにアルファベットで並べ替えたいと考えています。

たとえば、私は現在ORDER BY title、最後に単純なものを使用してこれを取得しています。

  • Abc
  • 定義
  • 321

しかし、私はこれが欲しい:

  • 321
  • Abc
  • 定義

奇妙なことに、SQL Developer は「正しい」順序で数字を最初に表示します。しかし、私のアプリ (OCI8 を使用する PHP) では、数字が最後に表示されます。

4

2 に答える 2

17

Oracleの専門家ではありませんが、セッションを変更せずにそれを行うことができるはずです

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

ニーズに合わせてを変更できます (NLS_SORT=のリストは次のとおりです) 。

これによりテーブルスキャンが強制されるとドキュメントに記載されているため、最初にそれらをフィルタリングすることが有益であることに注意してください(ただし、すべてのテーブルスキャンを選択する場合は、とにかく使用するものです)。

SQL Developer が異なる動作を示す理由は、おそらくセッションを変更するためです。

于 2010-12-01T12:55:53.743 に答える
7

表示されている動作の違いは、おそらく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
于 2010-12-01T12:48:40.853 に答える