Добавить начальный ноль в поле цифры c varchar в QueryContext Oracle - PullRequest
0 голосов
/ 12 февраля 2020

Я работаю над весенним проектом, в котором сортировка будет применяться в порядке возрастания или убывания. Тип столбца 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, чтобы получить правильный результат?

1 Ответ

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

Если вы используете Oracle 12.2 или выше, вы можете воспользоваться функцией TO_NUMBER с предложением ON CONVERSION ERROR в предложении ORDER BY следующим образом:

TO_NUMBER(myNum DEFAULT 999999999 ON CONVERSION ERROR), MYNUM  -- Your orderByClauses

- -Обновление

Для более низкой версии oracle используйте regexp_like, как указано ниже

CASE WHEN REGEXP_LIKE(myNum, '^[\.|[:digit:]]+$') THEN 1 ELSE 2 END 
,MYNUM -- Your orderByClauses

Cheers !!

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