Làm thế nào để sử dụng SQL Order By statement để sắp xếp kết quả không nhạy cảm?


144

Tôi có một cơ sở dữ liệu SQLite mà tôi đang cố gắng sắp xếp theo thứ tự Bảng chữ cái. Vấn đề là, SQLite dường như không xem xét A = a trong khi sắp xếp, do đó tôi nhận được kết quả như sau:

A B C T a b c g

Tôi muốn có được:

A a B B C c g T

Điều SQL đặc biệt nào cần được thực hiện mà tôi không biết?

SELECT * FROM NOTES ORDER BY title

2
Và cách hiệu quả hơn để làm điều đó là gì? "ĐẶT HÀNG B TNG TITLE THU THẬP NỀN TẢNG" hoặc "ĐẶT HÀNG B LNG ÍT (TITLE)". (FYI, trong trường hợp của tôi, chạy trên Android, tức là SQLite)
Pascal

Câu trả lời:


253

Bạn cũng có thể làm ORDER BY TITLE COLLATE NOCASE.

Chỉnh sửa: Nếu bạn cần chỉ định ASChoặc DESC, thêm phần này sau khi NOCASEthích

ORDER BY TITLE COLLATE NOCASE ASC

hoặc là

ORDER BY TITLE COLLATE NOCASE DESC

8
"ĐẶT HÀNG B TNG TITLE THU THẬP NOCASE" có hiệu quả hơn "ĐẶT HÀNG B LNG LOWER (TITLE)" không?
Pascal

RẤT NHIỀU THÀNH CÔNG! phải không Ồ tại sao SQLite lại khiến nó trở nên nhạy cảm khi sắp xếp .... không phù hợp với tôi ... thật không may!
Vincy

1
@Vincy: Tôi không thấy có gì lạ khi so sánh chuỗi phân biệt chữ hoa chữ thường. Đó là cách các <, ==vv khai thác công trình theo mặc định trong mọi ngôn ngữ lập trình mà tôi quen thuộc với.
dan04

@ dan04 tần suất bạn cần một chuỗi phải phân biệt chữ hoa chữ thường? đó là lý do tại sao nó là vô lý. Ai trên thế giới quan tâm đến các trường hợp trong khi sắp xếp một chuỗi? Nơi duy nhất tôi thấy lợi thế là xác thực hoặc xác thực mật khẩu! Đó là lý do tại sao mặc định nó phải là CASE INSENSITIVE, imo!
Vincy

Điều này thường sẽ không hoạt động nếu hộp cơ sở dữ liệu sử dụng UTF8. (Lưu ý rằng tiêu đề không chỉ đề cập đến SQLite.) Trong trường hợp này, đề xuất sử dụng hàm dưới () hoặc trên () bên dưới là tiêu đề hoạt động.
marco

99

Bạn chỉ có thể chuyển đổi mọi thứ thành chữ thường cho mục đích sắp xếp:

SELECT * FROM NOTES ORDER BY LOWER(title);

Nếu bạn muốn chắc chắn rằng những cái viết hoa vẫn kết thúc trước những cái viết thường, chỉ cần thêm nó như là một loại thứ cấp:

SELECT * FROM NOTES ORDER BY LOWER(title), title;

1
Tôi đang sắp xếp theo nhiều cột, tôi có phải đặt LOWER xung quanh mỗi cột không?
CodeFusionMobile

2
Có, không có cách nào để thay đổi hành vi của ORDER BY thành không phân biệt chữ hoa chữ thường.
Chad Birch

1
Có sự khác biệt nào giữa 'LỚN' và 'ÍT HƠN'
Jagadeesh

2
Đối với mục đích này, không có cả hai sẽ đạt được hiệu quả như nhau, đó là làm cho trường hợp của tất cả các mục giống nhau.
Ben Baron

1
Chúng chỉ khác nhau cho các ký tự [] ^ _ `.
dan04

0
SELECT * FROM NOTES ORDER BY UPPER(title)              

14
Cảm ơn câu trả lời của bạn. Nhưng: Một câu trả lời hay sẽ luôn có lời giải thích về những gì đã được thực hiện và tại sao nó được thực hiện theo cách như vậy, không chỉ cho OP mà còn cho những khách truy cập tương lai đến SO.
B001
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.