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

Javascript Sắp xếp một mảng giống như thứ tự trong Oracle

Iirc, Oracle thực hiện sắp xếp từ vựng 3 tầng (nhưng chú ý đến lời khuyên của Alex Poole và kiểm tra cài đặt NLS trước):

  • Sắp xếp đầu tiên theo các ký tự cơ bản bỏ qua chữ hoa và dấu, các chữ số đứng sau các chữ cái trong chuỗi đối chiếu.
  • Thứ hai, về các mối quan hệ, hãy phân loại theo cách tôn trọng các dấu phụ, bỏ qua chữ hoa và chữ thường.
  • Thứ ba, các mối quan hệ sắp xếp theo trường hợp.

Bạn có thể mô phỏng hành vi bằng cách sử dụng apis ngôn ngữ javascript bằng cách bắt chước lần lượt từng bước trong một hàm so sánh tùy chỉnh, ngoại trừ đảo ngược chữ cái-chữ số trong chuỗi đối chiếu.

Giải quyết vấn đề thứ hai bằng cách xác định 10 điểm mã liền kề không đại diện cho chữ số và nằm ngoài tập hợp các điểm mã có thể xuất hiện trong chuỗi bạn đang sắp xếp. Ánh xạ các chữ số vào thứ tự bảo toàn dải mã đã chọn. Khi bạn sắp xếp, hãy chỉ định phần mở rộng đối chiếu Unicode 'trực tiếp' có nghĩa là 'sắp xếp theo điểm mã'. Sửa lại sau khi sắp xếp.

Trong mã PoC bên dưới, tôi đã chọn một số ký tự cyrillic.

function cmptiered(a,b) {
    //
    // aka oracle sort
    //
    return lc_base.compare(a, b) || lc_accent.compare(a, b) || lc_case.compare(a, b);
}  // cmptiered

var lc_accent   = new Intl.Collator('de', { sensitivity: 'accent' });
var lc_base     = new Intl.Collator('de-DE-u-co-direct', { sensitivity: 'base' });
var lc_case     = new Intl.Collator('de', { caseFirst: 'lower', sensitivity: 'variant' });

var array = ['Ba12nes','Apfel','Banane','banane','abc','ABC','123','2', null, 'ba998ne' ];

// Map onto substitute code blocks
array = array.map ( function ( item ) { return (item === null) ? null : item.replace ( /[0-9]/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - "0".charCodeAt(0) + "\u0430".charCodeAt(0)); } ); } );

array.sort(cmptiered);

// Remap substitute code point
array = array.map ( function ( item ) { return (item === null) ? null : item.replace ( /[\u0430-\u0439]/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - "\u0430".charCodeAt(0) + "0".charCodeAt(0)); } ); } );

Chỉnh sửa

Hàm cmptiered sắp xếp hợp lý sau bình luận của Nina Scholz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GRANT có thể được sử dụng bên trong Thủ tục lưu trữ Oracle không?

  2. CẬP NHẬT với CASE và IN - Oracle

  3. JUnit / HSQLDB:Cách khắc phục lỗi với cú pháp Oracle khi kiểm tra bằng HSQLDB (không có đặc quyền và / hoặc không có đối tượng DUAL)

  4. JOOQ Oracle Number chính xác và ánh xạ số java

  5. Giá trị ràng buộc mảng Oracle.DataAccess (ODP.NET) không nằm trong phạm vi mong đợi