web-dev-qa-db-ja.com

さまざまなケースでテーブル列でソートするにはどうすればよいですか(Oracle)

Varchar2の列を持つテーブルをさまざまなケースで文字で並べ替えるにはどうすればよいですか([〜#〜] upper [〜#〜]およびlower)?

たとえば、[名前]列で注文すると、次の結果が得られます。

ANNIE
BOB
Daniel
annie
bob

私が欲しいのはこのようなものです:

ANNIE
annie
BOB
bob
Daniel
22
acidRain

lower(field)を使用します。例:.

_select * from tbl order by lower(name)
_

英語以外の言語の特殊文字に対処する必要がある場合は、NLSSORTに関する他の回答が必要になる場合があります。 KISSを使用してlower()を試してみてください。覚えて使用したり、他の人が読んだりすることが非常に簡単です(メンテナンス性)。

36
Michael Durrant

もう1つのオプションは、 [〜#〜] nlssort [〜#〜] 関数を使用して 言語ソート を実行することです。

SQL> with test as (select 'ANNIE' as col from dual
  2      union all select 'BOB' from dual
  3      union all select 'Daniel' from dual
  4      union all select 'annie' from dual
  5      union all select 'bob' from dual
  6      union all select 'Ångström' from dual
  7      union all select 'ångström' from dual)
  8  select col
  9  from test
 10  order by nlssort(col, 'NLS_SORT = WEST_EUROPEAN')
 11  /

COL
----------
Ångström
ångström
ANNIE
annie
BOB
bob
Daniel

利点は、柔軟性が高いことです。アクセント付きの文字やさまざまな大文字小文字を一緒に並べ替えることができます。 NLS_SORTに異なる値を指定する によって、言語固有の方法で一部の文字を処理することを選択できます。同等の文字のセット内の順序を定義します。したがって、「A」と「a」は一緒にソートされますが、「a」内では大文字が最初になります。短所私はベンチマークを付けていませんが、NLSSORTはLOWERよりも多くのCPUを使用すると予想しています。また、NLSSORTは 長い文字列 のプレフィックスのみを使用します:

返される文字列は、照合キーとも呼ばれ、RAWデータ型です。特定の照合の特定のchar値から生じる照合キーの長さは、NLSSORTによって返されるRAW値の最大長である2000バイトを超える場合があります。この場合、NLSSORTは、計算結果が2000バイトを超えないように、charの最大プレフィックスまたは初期部分文字列の照合キーを計算します。 FRENCHなどの単一言語照合の場合、プレフィックス長は通常1000文字です。 GENERIC_Mなどの多言語照合の場合、プレフィックスは通常500文字です。正確な長さは、照合順序とcharに含まれる文字に応じて、短くなったり長くなったりする場合があります。

13

Oracleの比較的新しいバージョンを使用している場合は、LOWER()関数を使用するのではなく、NLS_SORT/NLS_COMPの設定を検討する必要があります。

インスタンスにグローバルに影響を与えたくない場合は、NLSSORT()関数を使用して、特定のクエリのスコープにNLS_SORTを設定できます。

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

これの良い例が見つかります here。

7
Mark J. Bobak

INITCAPを使用できます。

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