如何在具有不同情況下字符的varchar2列進行排序(UPPER和lower)?如何在不同情況下按列表排序(Oracle)
例如,當我在名稱列做一個訂單,我得到如下結果:
ANNIE
BOB
Daniel
annie
bob
我想是這樣的:
ANNIE
annie
BOB
bob
Daniel
如何在具有不同情況下字符的varchar2列進行排序(UPPER和lower)?如何在不同情況下按列表排序(Oracle)
例如,當我在名稱列做一個訂單,我得到如下結果:
ANNIE
BOB
Daniel
annie
bob
我想是這樣的:
ANNIE
annie
BOB
bob
Daniel
使用lower(field)
,例如
select * from tbl order by lower(name)
如果您需要處理非英語語言的特殊字符,那麼關於NLSSORT的其他答案可能就是您需要的。如果你不這樣做,我會嘗試和KISS並使用lower()
,因爲它很容易記住和使用,並被他人閱讀(可維護性)。
如果您使用的是相對較新版本的Oracle,則應該考慮設置NLS_SORT/NLS_COMP,而不是使用LOWER()函數。
如果您不想全局影響實例,則可以使用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將改變所有查詢的行爲。如果那是我們想要的,那很好。如果不是這樣,那就太好了。 – 2012-03-20 16:20:45
不一定。我會回去編輯我的示例來演示。 – 2012-03-20 16:52:02
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 – 2012-03-20 22:09:16
另一種選擇是使用NLSSORT功能的執行linguistic sorting:
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數據 類型。由給定排序規則的char 值產生的排序規則關鍵字的長度可能會超過2000字節,即NLSSORT返回的RAW值的最大長度的 。在這種情況下, NLSSORT計算char的最大前綴或子字符串的初始排序鍵,以便計算結果不超過2000 字節。對於單語排序規則,例如FRENCH,前綴 長度通常爲1000個字符。對於多語言歸類,對於 示例GENERIC_M,前綴通常爲500個字符。確切的 長度可能會更低或更高,具體取決於char中包含的排序規則和 字符。
有關使用索引進行語言排序的信息,請參閱http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch5lingsort.htm#i1006421。 – 2012-03-20 16:21:42
+1好例子。 – DCookie 2012-03-20 19:52:37
您可以通過cluse使用爲了這個
select col_name from table_name
order by col_name ;
您可以使用INITCAP
例如
SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC;
沒有理由提供比接受的答案好的答案。此外,initcap不會這樣做(考慮'ANNA'和'annie')。 – 2015-12-02 17:27:55
有一點需要補充的是,這意味着除非'lower(name)'有一個函數索引,否則將使用此查詢完成全表掃描。 – beny23 2012-03-20 15:00:45
此查詢將始終需要全表掃描,可以帶或不帶ORDER BY。通常,您所描述的問題對於WHERE子句更爲重要。 – DCookie 2012-03-20 15:57:14
@DCookie:你想賭嗎? ;)例如試試'lower(name)'的函數索引,並附上table =完整索引掃描中的所有列,再加上沒有排序:) - 只是說' – 2012-03-21 05:12:25