Oracle
 sql >> Base de données >  >> RDS >> Oracle

Javascript Trier un tableau comme ordre par dans Oracle

Iirc, Oracle implémente un tri lexicographique à 3 niveaux (mais tenez compte des conseils d'Alex Poole et vérifiez d'abord les paramètres NLS) :

  • Trier d'abord par caractères de base en ignorant la casse et les signes diacritiques, les chiffres viennent après les lettres dans la séquence de classement.
  • Deuxièmement, sur les liens trier en respectant les signes diacritiques, en ignorant la casse.
  • Troisièmement, trier les cravates par caisse.

Vous pouvez émuler le comportement en utilisant javascript locale apis en imitant tour à tour chaque étape dans une fonction de comparaison personnalisée, à l'exception de l'inversion lettre-chiffre dans la séquence de classement.

Abordez ce dernier en identifiant 10 points de code contigus qui ne représentent pas des chiffres et qui se situent au-delà de l'ensemble de points de code qui peuvent apparaître dans les chaînes que vous triez. Mappez les chiffres sur la plage de points de code choisie en préservant l'ordre. Lorsque vous triez, spécifiez l'extension de classement Unicode "direct" qui signifie "tri par point de code". Remappez après le tri.

Dans le code PoC ci-dessous, j'ai choisi des caractères cyrilliques.

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

Modifier

Fonction cmptiered rationalisé suite au commentaire de Nina Scholz.