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.
Nguồn
2012-03-20 16:13:48
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
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
@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 ' –