sql >> Databasteknik >  >> RDS >> Oracle

Javascript Sortera en Array-liknande ordning efter i Oracle

Iirc, Oracle implementerar en lexikografisk sortering i tre nivåer (men följ råden från Alex Poole och kontrollera NLS-inställningarna först):

  • Sortera först efter bastecken och ignorera skiftläge och diakritiska tecken, siffror kommer efter bokstäver i sorteringssekvensen.
  • För det andra, på slipsar som respekterar diakritiska tecken, ignorerar skiftläge.
  • Tredje, på slipsar sortera efter fall.

Du kan emulera beteendet med javascript locale apis a> genom att efterlikna varje steg i tur och ordning i en anpassad jämförelsefunktion, med undantag för inverteringen av bokstavssiffror i sorteringssekvensen.

Ta itu med det senare genom att identifiera 10 sammanhängande kodpunkter som inte representerar siffror och som ligger utanför den uppsättning kodpunkter som kan förekomma i strängarna du sorterar. Mappa siffror till den valda kodpunktsintervallets bevarande ordning. När du sorterar, ange Unicodes sammanställningstillägg "direkt", vilket betyder "sortering efter kodpunkt". Mappa om efter sortering.

I PoC-koden nedan har jag valt några kyrilliska tecken.

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

Redigera

Funktion cmptiered strömlinjeformad efter Nina Scholz kommentar.



  1. Parameteriserad Oracle SQL-fråga i Java?

  2. Stoppa MySQL-tjänstfönster

  3. Datatrunkering:Data för långa för kolumn "logotyp" på rad 1

  4. Pandas to_sql misslyckas på duplicerad primärnyckel