Увеличение и сравнение версий в pl / sql - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу сделать следующее

  • 1a.0.0.0 должно предшествовать 18.9.3.1 в виде
  • 1a.0.0.0 должно стоять на первом месте
  • Увеличение на 1 для любой цифры c значение
  • Увеличение по алфавиту любой буквенной цифры c значение
  • Выбор максимальной версии с помощью правильной сортировки

создать таблицу revision_table (revision_nbr varchar2 (30))

REVISION_NBR
1.0.0.0
1.2.0.1
18.9.3.1
1a.0.0.0
20.2.0.0
20a.2.0.0

1 Ответ

0 голосов
/ 16 февраля 2020

Ну, это звучит как " Дурацкое поручение ", если не просто плохой дизайн. Сначала давайте дадим версии определение формата.

  • Пусть Версия, обозначенная V, состоит из уровней, обозначенных L, разделенных одинарными точками, (V -> L1.L2. ... Ln)
  • Пусть каждый уровень состоит из обязательной строки цифр, обозначенной через Lnd, и строки параметров из строчных букв Engli sh, обозначенных буквой a - z, обозначенной через Lns. С определением это ручная сортировка списка версий на L1d, L1s, L2d, L2s ... Lnd, Lds. Там, где пропущено, значения Lns сортируются до конца списка для данного Ln.

Следующий SQL выполняет запрошенную сортировку для N = 4.

with versions as 
   (select '1.2.3.4'  v  from dual union all
    select '1.0.0.0'     from dual union all
    select '1.2.0.1'     from dual union all
    select '1.10.0.1'    from dual union all    
    select '18.9.3.1'    from dual union all
    select '1a.0.0.0'    from dual union all
    select '1b.0.0.0'    from dual union all    
    select '20.2.0.0'    from dual union all    
    select '20a.2.0.0'   from dual union all
    select '1az.0.0.0'   from dual union all     
    select '1a.2b.3c.4d' from dual 
   )  
select v
  from versions
 order by  
       to_number(regexp_replace(replace(regexp_substr(v,'(\d+)([a-z]*)(\.|$)',1,1 ) ,'.',null),'(\d+)([a-z]*)','\1') )
     , regexp_replace(replace(regexp_substr(v,'(\d+)([a-z]*)(\.|$)',1,1 ) ,'.',null),'(\d+)([a-z]*)','\2') 
     , to_number(regexp_replace(replace(regexp_substr(v,'(\d+)([a-z]*)(\.|$)',1,2 ) ,'.',null),'(\d+)([a-z]*)','\1') )
     , regexp_replace(replace(regexp_substr(v,'(\d+)([a-z]*)(\.|$)',1,2 ) ,'.',null),'(\d+)([a-z]*)','\2')  
     , to_number(regexp_replace(replace(regexp_substr(v,'(\d+)([a-z]*)(\.|$)',1,3 ) ,'.',null),'(\d+)([a-z]*)','\1') )
     , regexp_replace(replace(regexp_substr(v,'(\d+)([a-z]*)(\.|$)',1,3 ) ,'.',null),'(\d+)([a-z]*)','\2')  
     , to_number(regexp_replace(replace(regexp_substr(v,'(\d+)([a-z]*)(\.|$)',1,4 ) ,'.',null),'(\d+)([a-z]*)','\1') )
     , regexp_replace(replace(regexp_substr(v,'(\d+)([a-z]*)(\.|$)',1,4 ) ,'.',null),'(\d+)([a-z]*)','\2')        
;

Так что требуется забота о Легкая часть правильная (?) сортировка. Для увеличения версий определяется функция со следующими параметрами: версия для увеличения (V), уровень для увеличения (Ln), часть уровня для увеличения (Lnd) или (Lns)

В дополнение к просто повышению указанного значения параметров, что необходимо сделать для текущих неопределенных действий.

  • При увеличении Lns и буквы уже 'z'.
  • Когда существует увеличение Lnd и Lns, сохранить или сбросить Lns.
  • Как увеличить Lnd + Lns до Lnd (ie 1a. До 1.) Вы действительно не хотите этого делать, но если вы попытаетесь хорошо повторить @ AP C: Удачи с этим.
...