PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Đặt Order By để bỏ qua dấu câu trên cơ sở mỗi cột

"Chuẩn hóa" để sắp xếp

Bạn có thể sử dụng regexp_replace() với mẫu '[^a-zA-Z]' trong ORDER BY nhưng điều đó chỉ nhận dạng các chữ cái ASCII thuần túy. Sử dụng tốt hơn tốc ký của lớp '\W' nhận dạng các chữ cái khác không phải ASCII trong ngôn ngữ của bạn như äüóèß v.v. Hoặc bạn có thể ứng biến và "bình thường hóa tất cả các ký tự có phần tử dấu phụ về dạng cơ sở của chúng với sự trợ giúp của unaccent() hàm số. Hãy xem xét bản demo nhỏ này:

SELECT *
      , regexp_replace(x, '[^a-zA-Z]', '', 'g')
      , regexp_replace(x, '\W', '', 'g')
      , regexp_replace(unaccent(x), '\W', '', 'g')
FROM  (
SELECT 'XY ÖÜÄöüäĆČćč€ĞğīїıŁłŃńŇňŐőōŘřŠšŞşůŽžż‘´’„“”­–—[](),;.:̈� XY'::text AS x) t

-> SQLfiddle cho Postgres 9.2.
-> SQLfiddle dành cho Postgres 9.1.

Mã biểu thức chính quy đã được cập nhật trong phiên bản 9.2. Tôi đang giả định đây là lý do cho việc xử lý được cải thiện trong 9.2 trong đó tất cả các ký tự chữ cái trong ví dụ được khớp, trong khi 9.1 chỉ khớp với một số.

unaccent() được cung cấp bởi mô-đun bổ sung unaccent . Chạy:

CREATE EXTENSION unaccent;

một lần cho mỗi cơ sở dữ liệu để sử dụng (Postgres 9.1+, các phiên bản cũ hơn sử dụng kỹ thuật khác ).

ngôn ngữ / đối chiếu

Bạn phải biết rằng Postgres dựa vào hệ điều hành cơ bản cho các ngôn ngữ (bao gồm cả đối chiếu). Thứ tự sắp xếp được điều chỉnh bởi ngôn ngữ bạn đã chọn hoặc LC_COLLATE . Thêm câu trả lời có liên quan này:
Thứ tự sắp xếp chuỗi (LC_COLLATE và LC_CTYPE)

kế hoạch kết hợp hỗ trợ đối chiếu trực tiếp vào Postgres , nhưng không có sẵn tại thời điểm này.

Nhiều ngôn ngữ bỏ qua các ký tự đặc biệt mà bạn mô tả để sắp xếp dữ liệu ký tự ra khỏi hộp. Nếu bạn đã cài đặt ngôn ngữ trong hệ thống của mình để cung cấp thứ tự sắp xếp mà bạn đang tìm kiếm, bạn có thể sử dụng ngôn ngữ đó đặc biệt trong Postgres 9.1 trở lên:

SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"

Để xem những đối chiếu nào đã được cài đặt và có sẵn trong cài đặt Postgres hiện tại của bạn:

SELECT * FROM pg_collation;

Rất tiếc, không thể xác định đối chiếu tùy chỉnh của riêng bạn (chưa) trừ khi bạn hack mã nguồn.

Các quy tắc đối chiếu thường được điều chỉnh bởi các quy tắc của một ngôn ngữ được nói ở một quốc gia. Thứ tự sắp xếp danh bạ điện thoại sẽ nằm trong, nếu vẫn còn danh bạ điện thoại ... Hệ điều hành của bạn cung cấp chúng.

Ví dụ, trong Debian Linux, bạn có thể sử dụng:

locale -a

để hiển thị tất cả các ngôn ngữ đã tạo. Và:

dpkg-reconfigure locales

với tư cách là người dùng root (một trong nhiều cách) để tạo / cài đặt thêm.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận kết quả từ hàm Postgresql có giá trị trong bảng với JOOQ

  2. Lỗi:Không thể tạo TypedQuery cho truy vấn có nhiều trả lại

  3. Làm cách nào để bảo vệ khỏi việc đưa vào SQL khi mệnh đề WHERE được tạo động từ biểu mẫu tìm kiếm?

  4. postgresql - truy vấn để xây dựng json

  5. Làm cách nào để nhập mô-đun hoặc cài đặt tiện ích mở rộng trong PostgreSQL 9.1+?