Я работаю над весенним проектом, в котором сортировка будет применяться в порядке возрастания или убывания. Тип столбца varchar. Это поле будет содержать цифры c в десятичном формате или цифры c в обоих случаях. Может содержать комбинацию алфавита и цифры (шансов на добавление таких значений может быть меньше). Поскольку это требование клиента, поэтому я не могу изменить тип данных столбца.
Допустим, значения для полей myNum:
- 2.12
- 0,11
- 0,45
- 1,7
- A12
- 4,80
- B34
- 0,56
После сортировки должен отображаться номер вверху, а алфавит внизу:
- 0,11
- 0,45
- 0,56
- 1,7
- 2.12
- 4.80
- A12
- B34
Код для создания запроса на сортировку:
queryContext.getSorts().forEach((s) -> {
if (orderByClauses.length() > 0) {
orderByClauses.append(", ");
}
if (s.getColumnName().equalsIgnoreCase("myNum")) {
orderByClauses.append("regexp_substr(myNum, '^\\D*') nulls first, to_number(regexp_substr(myNum, '\\d+\\.?\\d*'))");
} else {
orderByClauses.append(s.getColumnName() + " ");
}
orderByClauses.append(s.getDirection().toString());
});
Код работает нормально для приведенного выше примера, но дело в том, что, когда я добавляю .34 или .56 (без нуля перед десятичной дробью), сортировка работает неправильно.
Как я могу добавить от нуля до regexp_substr, чтобы получить правильный результат?