Закажите столбец varchar в порядке возрастания - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь расположить данные в столбце (тип varchar, name = PRODUCTVERSION) таблицы ORACLE SQL в порядке возрастания. Я пробовал:

SELECT * FROM KCProductVersion where productid =1 ORDER BY PRODUCTVERSION asc

enter image description here

Ответы [ 2 ]

4 голосов
/ 17 января 2020

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

order by
    to_number(regexp_substr(productversion, '\d+', 1, 1)),
    to_number(regexp_substr(productversion, '\d+', 1, 2)),
    to_number(regexp_substr(productversion, '\d+', 1, 3))

Если ваши номера версий могут состоять более чем из 3 частей, вы можете расширить предложение order by еще больше to_number() выражения.

Демонстрация на DB Fiddle :

with t as (
    select '1.0' productversion from dual
    union all select '1.10' from dual
    union all select '10.5.2' from dual
    union all select '16' from dual
    union all select '2.0.0' from dual
)
select * 
from t
order by
    to_number(regexp_substr(productversion, '\d+', 1, 1)),
    to_number(regexp_substr(productversion, '\d+', 1, 2)),
    to_number(regexp_substr(productversion, '\d+', 1, 3))
| PRODUCTVERSION |
| :------------- |
| 1.0            |
| 1.10           |
| 2.0.0          |
| 10.5.2         |
| 16             |
0 голосов
/ 17 января 2020

Я бы сделал это следующим образом:

SELECT * FROM KCProductVersion WHERE productid = 1 
ORDER BY
  CASE 
    WHEN ISNUMERIC(value) = 1 THEN CONVERT(INT, value)
  ELSE 999 --or whatever you need 
  END,
  value

Первая часть предложения ORDER BY преобразует все в INT с большим числом для нечисловых значений, чтобы они сортировались последними. Затем в конце сортируется алфавит. Если у вас есть большие объемы данных, это может быть непростая задача:

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