2012-03-20 4 views

答えて

35

使用lower(field)、例えば:

ANNIE 
BOB 
Daniel 
annie 
bob 

を私がしたいことは、このようなものです

select * from tbl order by lower(name) 

英語以外の言語の特殊文字に対処する必要がある場合は、NLSSORTに関するその他の回答が必要な場合があります。あなたが覚えていない場合、私はキスを試し、lower()を覚えて使用し、他人が読むことができるので(メンテナンス性)、使います。

+1

「lower(name)」に機能インデックスがないかぎり、このクエリでフルテーブルスキャンが行われることを意味します。 – beny23

+6

この問合せでは、ORDER BYの有無にかかわらず、常に全表スキャンが必要です。通常、WHERE句では、記述している問題がより重要になります。 – DCookie

+3

@DCookie:賭けたいですか? ;))。テーブル全体のインデックススキャンとプラスのソートからすべてのカラムを追加した 'lower(name)'の機能インデックスを試してみてください - ちょうど' –

7

比較的新しいバージョンの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.

+0

NLS_SORT/NLS_COMPを設定すると、すべてのクエリの動作が変更されます。それがあれが欲しいのは素晴らしいことです。そうでなければそれほど素晴らしいことはありません。 –

+0

必ずしもそうではありません。デモのために私の例を編集します。 –

+0

NLSSORTとNLS_SORTは両方ともOracleによって定義されていますが、異なるものです。この回答の先頭には、パラメータであるNLS_SORTが参照されています。しかし、私がコメントした後に追加されたコードは、NLSSORT関数を使用します。元々NLSSORTを意味していたのであれば、私のコメントは当てはまりません。 NLSSORT http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions113.htm#SQLRF00678、NLS_SORT http://docs.oracle.com/cd/E11882_01/server.112/e25513/initparams152。 htm#REFRN10127 –

12

別のオプションを見つけることができますlinguistic sortingを実行するための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 

利点は、より柔軟です。アクセントのある文字と異なるケースを一緒に並べ替えることができます。 specifying different values for NLS_SORTによって言語固有の方法でいくつかの文字を扱うことができます。同等の文字セット内の順序を定義します。だから「A」と「A」は一緒にソートされますが、「a」の中では大文字が最初に来ます。短所NLSSORTはLOWERよりも多くのCPUを使用することを期待していますが、ベンチマークしていません。そして、NLSSORTだけlonger stringsの接頭辞を使用します。また、照合キーとして知られ、

文字列が返さを、RAWデータ 型です。与えられた照合の与えられた文字 の値に起因する照合キーの長さは、NLSSORTによって返されるRAW値の最大長の である2000バイトを超えることがあります。この場合、 NLSSORTは、計算結果が2000 バイトを超えないように、charの最大接頭辞、または最初の 部分文字列の照合キーを計算します。フランス語のような単一言語の照合の場合、プレフィックス の長さは通常1000文字です。多言語照合の場合、 の例GENERIC_Mの場合、接頭辞は通常500文字です。正確な の長さは、照合に応じてより低くても高くてもよく、charに含まれる 文字になります。

+0

索引を言語ソートで使用する方法については、http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch5lingsort.htm#i1006421を参照してください。 –

+1

+1良いイラスト。 – DCookie

-1

あなたがINITCAP例えばを使用することができ、この

select col_name from table_name 
order by col_name ; 
0

ためcluseで注文を使用することができます

SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC; 
+1

受け入れられた答えよりも優れている答えはありません。さらに、initcapは実行しません( 'ANNA'と 'annie'を考慮)。 –

関連する問題