によってどのように私は(UPPERと下)様々なケースでは、文字とVARCHAR2の列を持つテーブルを並べ替えることができますすることができますか?どのように私は、ソート、様々なケースでのテーブル列(オラクル)
例えば、私は[名前]列の順を行うときに、私は次のような結果を得る:
ANNIE
annie
BOB
bob
Daniel
によってどのように私は(UPPERと下)様々なケースでは、文字とVARCHAR2の列を持つテーブルを並べ替えることができますすることができますか?どのように私は、ソート、様々なケースでのテーブル列(オラクル)
例えば、私は[名前]列の順を行うときに、私は次のような結果を得る:
ANNIE
annie
BOB
bob
Daniel
使用lower(field)
、例えば:
ANNIE
BOB
Daniel
annie
bob
を私がしたいことは、このようなものです
select * from tbl order by lower(name)
英語以外の言語の特殊文字に対処する必要がある場合は、NLSSORTに関するその他の回答が必要な場合があります。あなたが覚えていない場合、私はキスを試し、lower()
を覚えて使用し、他人が読むことができるので(メンテナンス性)、使います。
比較的新しいバージョンの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.
NLS_SORT/NLS_COMPを設定すると、すべてのクエリの動作が変更されます。それがあれが欲しいのは素晴らしいことです。そうでなければそれほど素晴らしいことはありません。 –
必ずしもそうではありません。デモのために私の例を編集します。 –
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 –
別のオプションを見つけることができます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に含まれる 文字になります。
索引を言語ソートで使用する方法については、http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch5lingsort.htm#i1006421を参照してください。 –
+1良いイラスト。 – DCookie
あなたがINITCAP
例えばを使用することができ、この
select col_name from table_name
order by col_name ;
ためcluseで注文を使用することができます
SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC;
受け入れられた答えよりも優れている答えはありません。さらに、initcapは実行しません( 'ANNA'と 'annie'を考慮)。 –
「lower(name)」に機能インデックスがないかぎり、このクエリでフルテーブルスキャンが行われることを意味します。 – beny23
この問合せでは、ORDER BYの有無にかかわらず、常に全表スキャンが必要です。通常、WHERE句では、記述している問題がより重要になります。 – DCookie
@DCookie:賭けたいですか? ;))。テーブル全体のインデックススキャンとプラスのソートからすべてのカラムを追加した 'lower(name)'の機能インデックスを試してみてください - ちょうど' –