sql >> Base de Datos >  >> RDS >> Oracle

Javascript Ordenar una matriz como order by en Oracle

Iirc, Oracle implementa una clasificación lexicográfica de 3 niveles (pero preste atención al consejo de Alex Poole y verifique primero la configuración de NLS):

  • Primero ordene por caracteres base ignorando mayúsculas y minúsculas, los dígitos vienen después de las letras en la secuencia de clasificación.
  • Segundo, en los empates ordene respetando los signos diacríticos, ignorando mayúsculas y minúsculas.
  • Tercero, ordenar las corbatas por caso.

Puede emular el comportamiento usando javascript locale apis imitando cada paso a su vez en una función de comparación personalizada, con la excepción de la inversión de letras y dígitos en la secuencia de clasificación.

Aborde este último identificando 10 puntos de código contiguos que no representan dígitos y que se encuentran más allá del conjunto de puntos de código que pueden aparecer en las cadenas que está clasificando. Asigne dígitos al rango de puntos de código elegido conservando el orden. Cuando ordene, especifique la extensión de clasificación Unicode 'directa', que significa 'ordenar por punto de código'. Reasignar después de ordenar.

En el código PoC a continuación, he elegido algunos caracteres cirílicos.

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

Editar

Función cmptiered simplificado siguiendo el comentario de Nina Scholz.