sql >> Databáze >  >> RDS >> Oracle

Javascript Třídění pořadí jako v poli v Oracle

Iirc, Oracle implementuje 3-úrovňové lexikografické třídění (ale dbejte rad Alexe Poolea a nejprve zkontrolujte nastavení NLS):

  • Nejprve seřaďte podle základních znaků bez ohledu na velká a malá písmena a diakritiku, číslice následují za písmeny v posloupnosti řazení.
  • Zadruhé, na kravatách se třídí s ohledem na diakritiku, ignoruje velká a malá písmena.
  • Za třetí, na kravatách třídění podle případu.

Toto chování můžete emulovat pomocí javascript locale apis napodobováním každého kroku postupně ve vlastní porovnávací funkci, s výjimkou inverze písmen a číslic v porovnávací sekvenci.

Vyřešte to tím, že identifikujete 10 souvislých kódových bodů, které nepředstavují číslice a které leží za sadou kódových bodů, které se mohou vyskytovat v řetězcích, které třídíte. Mapujte číslice do zvoleného rozsahu kódových bodů se zachováním pořadí. Při řazení zadejte příponu řazení Unicode „přímé“, což znamená „řazení podle bodu kódu“. Po seřazení přemapujte.

V níže uvedeném kódu PoC jsem vybral některé znaky cyrilice.

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

Upravit

Funkce cmptiered zjednodušené po komentáři Niny Scholzové.



  1. 2 Funkce pro získání roku z data v Oracle

  2. Porovnání binárních hodnot v MySQL

  3. Spojení různých tabulek na základě hodnoty sloupce

  4. Vyrovnávání zátěže databáze v cloudu – MySQL Master Failover s ProxySQL 2.0:Část první (nasazení)