Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Javascript Menyortir Array seperti memesan di Oracle

Iirc, Oracle mengimplementasikan pengurutan leksikografis 3 tingkat (tetapi perhatikan saran Alex Poole dan periksa pengaturan NLS terlebih dahulu):

  • Urutkan pertama berdasarkan karakter dasar dengan mengabaikan huruf besar/kecil dan diakritik, angka muncul setelah huruf dalam urutan susunan.
  • Kedua, pada jenis dasi menghormati diakritik, mengabaikan kasus.
  • Ketiga, pada dasi, urutkan berdasarkan kasus.

Anda dapat meniru perilaku menggunakan apis lokal javascript dengan meniru setiap langkah secara bergantian dalam fungsi perbandingan khusus, dengan pengecualian inversi huruf-digit dalam urutan susunan.

Atasi yang terakhir dengan mengidentifikasi 10 titik kode bersebelahan yang tidak mewakili angka dan yang berada di luar kumpulan titik kode yang mungkin terjadi dalam string yang Anda urutkan. Memetakan digit ke urutan pelestarian rentang titik kode yang dipilih. Saat Anda mengurutkan, tentukan ekstensi penyusunan Unicode 'langsung' yang berarti 'penyortiran berdasarkan titik kode'. Petakan ulang setelah disortir.

Dalam kode PoC di bawah ini saya telah memilih beberapa karakter 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)); } ); } );

Sunting

Fungsi cmptiered disederhanakan mengikuti komentar 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. Ubah String khusus menjadi Tanggal di H2

  2. Oracle Streams Contoh Replikasi Langkah demi Langkah

  3. kueri oracle sql untuk catatan dengan stempel waktu yang berada di antara dua stempel waktu

  4. Buffer terlalu kecil untuk konversi CLOB ke CHAR atau BLOB ke RAW

  5. Jenis Tabel di Oracle PL SQL Contoh