Oracle
 sql >> база данни >  >> RDS >> Oracle

Javascript Сортиране на масив като подреждане по в Oracle

Iirc, Oracle прилага 3-степенно лексикографско сортиране (но вслушайте се в съвета на Alex Poole и първо проверете настройките на NLS):

  • Първо сортиране по основни знаци, като се игнорират главни и големи букви и диакритични знаци, цифрите идват след буквите в последователността на сортиране.
  • Второ, сортирайте връзките, зачитайки диакритичните знаци, като пренебрегвате главните и главните букви.
  • Трето, при връзки сортиране по регистър.

Можете да емулирате поведението, като използвате javascript locale apis чрез имитиране на всяка стъпка на свой ред в персонализирана функция за сравняване, с изключение на буквено-цифровата инверсия в последователността на сортиране.

Справете се с последното, като идентифицирате 10 последователни кодови точки, които не представляват цифри и които се намират извън набора от кодови точки, които могат да се появят в низовете, които сортирате. Картирайте цифрите върху реда за запазване на диапазона на избраната кодова точка. Когато сортирате, укажете разширението за сортиране на Unicode „директно“, което означава „сортиране по кодова точка“. Повторно картографиране след сортиране.

В PoC кода по-долу съм избрал някои символи на кирилица.

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

Редактиране

Функция cmptiered рационализирано след коментара на Нина Шолц.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. rs.last() дава невалидна операция само за препращане на резултати:last

  2. count(*) не може да бъде избран в PL/SQL

  3. арабски знаци в базата данни на oracle

  4. Oracle - ИЗБЕРЕТЕ DENSE_RANK OVER (ORDER BY, SUM, OVER и PARTITION BY)

  5. Как да съедините две таблици, за да получите следния резултат?