Oracle
 sql >> Baza danych >  >> RDS >> Oracle

JavaScript Sortowanie kolejności tablicowej według w Oracle

Iirc, Oracle wdraża 3-poziomowe sortowanie leksykograficzne (ale posłuchaj rady Alexa Poole'a i najpierw sprawdź ustawienia NLS):

  • Najpierw sortuj według znaków podstawowych, ignorując wielkość liter i znaki diakrytyczne, cyfry występują po literach w kolejności sortowania.
  • Po drugie, sortuj według znaków diakrytycznych, ignorując wielkość liter.
  • Po trzecie, na krawatach sortuj według przypadku.

Możesz emulować zachowanie za pomocą javascript locale apis naśladując każdy krok po kolei w niestandardowej funkcji porównywania, z wyjątkiem inwersji literowo-cyfrowej w sekwencji sortowania.

Rozwiąż to ostatnie, identyfikując 10 ciągłych punktów kodowych, które nie reprezentują cyfr i które leżą poza zbiorem punktów kodowych, które mogą wystąpić w sortowanych ciągach. Mapuj cyfry na wybrany porządek zachowania zakresu punktów kodowych. Podczas sortowania określ rozszerzenie sortowania Unicode „bezpośrednie”, co oznacza „sortowanie według punktu kodowego”. Zmień mapę po sortowaniu.

W poniższym kodzie PoC wybrałem kilka znaków cyrylicy.

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)); } ); } );

Edytuj

Funkcja cmptiered usprawniono po komentarzu Niny 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. Jak utworzyć strefę DMZ dla EBS R12?

  2. Oracle Trispool tylko końcowe spacje (nie wiodące spacje)

  3. Jak zwrócić wiele wierszy z procedury składowanej? (PL/SQL Oracle)

  4. Usuwanie DUŻO danych w Oracle

  5. Tworzenie Oracle Cursor przy użyciu programu Java