Сортировать varchar2 с номерами, десятичной точкой и текстом в оракуле - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь отсортировать поле varchar2 в таблице оракула.Значения, которые я пытаюсь отсортировать:

Firmware( column name)
3.9P7S1
3.10P4S1

Если я делаю Order by Firmware desc, я получаю '3.9P7S1', тогда как я ожидаю '3.10P4S1'.

будетздорово найти помощь в решении этой проблемы.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Вот один из способов сделать это.Предполагая, что все входные данные имеют одну или несколько цифр, за которыми следует точка, за которой следуют одна или несколько цифр, за которыми следует некоторый другой фрагмент (возможно, пустой), который не начинается с цифры ... Порядок по убыванию первого целого числа, затемвторое целое число по убыванию, затем по оставшемуся фрагменту ASCENDING и с нулевыми первыми (так, например, прошивка '3.8' предшествует '3.8A'):

with
  inputs (firmware) as (
    select '3.9P7S1'  from dual union all
    select '3.10P4S1' from dual union all
    select '3.9PX20K' from dual union all
    select '3.1ST8X2' from dual union all
    select '3.1'      from dual union all
    select '2.9P7S1'  from dual union all
    select '3.9ABC32' from dual
  )
select firmware
from   inputs
order by to_number(regexp_substr(firmware, '^\d+')) desc,
         to_number(regexp_substr(firmware, '^\d+\.(\d+)', 1, 1, null, 1)) desc,
         regexp_replace(firmware, '\d+\.\d+') asc nulls first
;

FIRMWARE
--------
3.10P4S1
3.9ABC32
3.9P7S1
3.9PX20K
3.1
3.1ST8X2
2.9P7S1
1 голос
/ 25 сентября 2019

В вашем случае нам нужен номер перед любым символом строки для заказа.

Вы можете использовать regexp_substr следующим образом:

Select firmware, 
       regexp_substr(firmware, '[0-9]+(\.)[0-9]+') as num
  from your_table
Order by to_number(regexp_substr(num, '[0-9]+',1,1)) desc, 
     to_number(regexp_substr(num, '[0-9]+',1,2)) desc nulls last

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...