sql >> Database teknologi >  >> RDS >> Oracle

Javascript Sortering af en Array-lignende rækkefølge efter i Oracle

Iirc implementerer Oracle en 3-trins leksikografisk sortering (men følg rådene fra Alex Poole og tjek NLS-indstillingerne først):

  • Først sorteres efter grundtegn uden at ignorere store og små bogstaver og diakritiske tegn, cifre kommer efter bogstaver i sorteringssekvensen.
  • For det andet, på slips sortere med respekt for diakritiske tegn, ignorere store og små bogstaver.
  • For det tredje, om slips sorteret efter sag.

Du kan efterligne adfærden ved hjælp af javascript locale apis a> ved at efterligne hvert trin på skift i en brugerdefineret sammenligningsfunktion, med undtagelse af bogstav-ciffer-inversionen i sorteringssekvensen.

Håndter sidstnævnte ved at identificere 10 sammenhængende kodepunkter, der ikke repræsenterer cifre, og som ligger ud over det sæt af kodepunkter, der kan forekomme i de strenge, du sorterer. Tilknyt cifre til det valgte kodepunktområdes bevaringsrækkefølge. Når du sorterer, skal du angive Unicode-samlingsudvidelsen 'direct', som betyder 'sortering efter kodepunkt'. Omstil efter sortering.

I PoC-koden nedenfor har jeg valgt nogle kyrilliske tegn.

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

Rediger

Funktion cmptiered strømlinet efter Nina Scholz' kommentar.



  1. Hvordan kan jeg opdatere en kolonne fra en indlejret tabel i pl/sql?

  2. multibillede upload forkert antal ved fil-upload

  3. Kan ikke konvertere MySQL dato/tidsværdi til System.DateTime i VS2010

  4. Udførelse af forespørgsler dynamisk i PL/pgSQL