sql >> Database >  >> RDS >> Oracle

Javascript Sorteren van een array-achtige volgorde in Oracle

Iirc, Oracle implementeert een drieledige lexicografische sortering (maar luister naar het advies van Alex Poole en controleer eerst de NLS-instellingen):

  • Sorteer eerst op basistekens en negeer hoofdletters en diakritische tekens, cijfers komen na letters in de sorteervolgorde.
  • Ten tweede, op banden sorteren met respect voor diakritische tekens, hoofdletters negerend.
  • Ten derde, over stropdassen, per geval gesorteerd.

U kunt het gedrag emuleren met behulp van javascript locale apis door elke stap op zijn beurt na te bootsen in een aangepaste vergelijkingsfunctie, met uitzondering van de letter-cijferinversie in de sorteervolgorde.

Pak het laatste aan door 10 aaneengesloten codepunten te identificeren die geen cijfers vertegenwoordigen en die buiten de reeks codepunten liggen die kunnen voorkomen in de strings die u sorteert. Wijs cijfers toe aan de gekozen volgorde van het codepuntbereik. Geef bij het sorteren de Unicode-sorteerextensie 'direct' op, wat 'sorteren op codepunt' betekent. Opnieuw toewijzen na sorteren.

In de PoC-code hieronder heb ik een aantal cyrillische tekens gekozen.

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

Bewerken

Functie cmptiered gestroomlijnd na de opmerking van Nina Scholz.



  1. SQLite JSON_OBJECT()

  2. MySQL Split-Brain elimineren in multi-clouddatabases

  3. Vind globale pakketvariabelen uit datadictionary

  4. Wat is een oplossing van Multiple ResultSets zijn geretourneerd door de query?