2012-03-20 45 views

Trả lời

35

Sử dụng lower(field), ví dụ:

ANNIE 
BOB 
Daniel 
annie 
bob 

Những gì tôi muốn một cái gì đó như thế này là

select * from tbl order by lower(name) 

Nếu bạn cần giải quyết các ký tự đặc biệt cho ngôn ngữ không phải tiếng Anh thì các câu trả lời khác về NLSSORT có thể là những gì bạn cần. Nếu bạn không, tôi sẽ thử và KISS và sử dụng lower() vì nó rất dễ nhớ và sử dụng và được đọc bởi những người khác (bảo trì).

+1

Một điều cần thêm là điều này có nghĩa là trừ khi có chỉ mục chức năng trên 'lower (name)' thì quét toàn bộ bảng sẽ được thực hiện với truy vấn này. – beny23

+6

Truy vấn này sẽ luôn yêu cầu quét toàn bộ bảng, có hoặc không có ORDER BY. Thông thường vấn đề bạn mô tả là quan trọng hơn với mệnh đề WHERE. – DCookie

+3

@DCookie: bạn có muốn đặt cược không? ;) ví dụ. thử một chỉ mục chức năng trên 'lower (name)' được nối với tất cả các cột từ bảng = quét chỉ mục đầy đủ, cộng với không có loại :) - chỉ cần nói ' –

7

Nếu bạn đang sử dụng phiên bản Oracle tương đối gần đây, bạn nên xem xét thiết lập NLS_SORT/NLS_COMP, thay vì sử dụng hàm LOWER().

Nếu bạn không muốn ảnh hưởng toàn cục đến cá thể, bạn có thể sử dụng hàm NLSSORT() để đặt NLS_SORT cho phạm vi truy vấn cụ thể.

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 

Một ví dụ tốt về điều này có thể được tìm thấy here.

+0

Cài đặt NLS_SORT/NLS_COMP sẽ thay đổi hành vi của tất cả các truy vấn. Đó là tuyệt vời nếu đó là những gì người ta muốn. Không tuyệt vời như vậy nếu nó không phải là. –

+0

Không nhất thiết. Tôi sẽ quay lại và chỉnh sửa ví dụ của tôi để minh họa. –

+0

NLSSORT & NLS_SORT đều được định nghĩa bởi Oracle nhưng là những thứ khác nhau. Phần đầu của câu trả lời này được tham chiếu NLS_SORT, một tham số. Tuy nhiên mã được thêm vào sau khi tôi nhận xét sử dụng chức năng NLSSORT. Vì vậy, nếu ban đầu bạn có nghĩa là NLSSORT, bạn đúng là nhận xét của tôi sẽ không áp dụng. 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

Một lựa chọn khác là sử dụng các NLSSORT chức năng để thực hiện 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 

Những lợi thế là linh hoạt hơn. Người ta có thể sắp xếp các ký tự có dấu trọng âm cũng như các trường hợp khác nhau lại với nhau. Người ta có thể chọn để điều trị một số ký tự theo ngôn ngữ cụ thể theo cách specifying different values for NLS_SORT. Xác định thứ tự trong tập hợp các ký tự tương đương. Vì vậy, 'A' và 'a' được sắp xếp cùng nhau, nhưng trong 'a', chữ hoa phía trước xuất hiện trước. Nhược điểm Tôi hy vọng rằng NLSSORT sử dụng nhiều CPU hơn LOWER, mặc dù tôi không có băng ghế dự bị đánh dấu nó. Và NLSSORT sẽ chỉ sử dụng một tiền tố của longer strings:

chuỗi trả lại, còn được gọi là chìa khóa đối chiếu, là dữ liệu RAW loại. Độ dài của khóa đối chiếu do giá trị char cho một giá trị đã cho có thể vượt quá 2000 byte, là chiều dài tối đa giá trị RAW được trả lại bởi NLSSORT. Trong trường hợp này, NLSSORT tính toán khóa đối chiếu cho một tiền tố tối đa hoặc chuỗi con đầu tiên của char để kết quả tính toán không vượt quá 2000 byte. Đối với các đối chiếu đơn âm, ví dụ FRENCH, tiền tố chiều dài thường là 1000 ký tự. Đối với các đối chiếu đa ngôn ngữ, đối với ví dụ GENERIC_M, tiền tố thường là 500 ký tự. Chiều dài chính xác của có thể thấp hơn hoặc cao hơn tùy thuộc vào đối chiếu và các ký tự chứa trong char.

+0

Xem http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch5lingsort.htm#i1006421 để biết thông tin về cách sử dụng các chỉ mục có phân loại ngôn ngữ. –

+1

+1 minh họa tốt. – DCookie

-1

Bạn có thể sử dụng Sắp xếp theo cluse cho điều này

select col_name from table_name 
order by col_name ; 
0

Bạn có thể sử dụng INITCAP ví dụ

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

Không có lý do gì để cung cấp câu trả lời không tốt hơn câu trả lời được chấp nhận. Hơn nữa, initcap sẽ không làm (xem xét 'ANNA' và 'annie'). –

Các vấn đề liên quan