PostgreSQL của tôi sắp xếp theo cách bạn muốn. Cách PostgreSQL so sánh các chuỗi được xác định bởi ngôn ngữ và đối chiếu. Khi bạn tạo cơ sở dữ liệu bằng createdb
có -l
tùy chọn để đặt ngôn ngữ. Ngoài ra, bạn có thể kiểm tra cách nó được định cấu hình trong môi trường của bạn bằng cách sử dụng psql -l
:
[[email protected]]$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------+----------+----------+------------+------------+-----------------------
mn_test | postgres | UTF8 | pl_PL.UTF8 | pl_PL.UTF8 |
Như bạn thấy cơ sở dữ liệu của tôi sử dụng đối chiếu Ba Lan.
Nếu bạn đã tạo cơ sở dữ liệu bằng cách sử dụng đối chiếu khác thì bạn có thể sử dụng đối chiếu khác trong truy vấn giống như:
SELECT * FROM sort_test ORDER BY name COLLATE "C";
SELECT * FROM sort_test ORDER BY name COLLATE "default";
SELECT * FROM sort_test ORDER BY name COLLATE "pl_PL";
Bạn có thể liệt kê các ảnh ghép có sẵn bằng:
SELECT * FROM pg_collation;
ĐÃ CHỈNH SỬA:
Ồ, tôi đã nhớ rằng 'a11' phải đứng trước 'a2'.
Tôi không nghĩ rằng đối chiếu tiêu chuẩn có thể giải quyết việc sắp xếp chữ và số. Để phân loại như vậy, bạn sẽ phải chia chuỗi thành các phần giống như trong phản hồi Clodoaldo Neto. Một tùy chọn khác hữu ích nếu bạn thường xuyên phải sắp xếp theo cách này là tách trường tên thành hai cột. Bạn có thể tạo trình kích hoạt trên INSERT và UPDATE tách name
thành name_1
và name_2
và sau đó:
SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;
(Tôi đã đổi đối chiếu từ tiếng Ba Lan sang tiếng Anh, bạn nên sử dụng đối chiếu bản địa của mình để sắp xếp các chữ cái như aącć, v.v.)