Сортировка оракула с текстом как число

мой NLS настройки:

NLS_SORT    POLISH
NLS_COMP    BINARY

Простой тестовый запрос:

select * from (
  select '11117' as x from dual
  union
  select '12988' as x from dual
  union 
  select '14659' as x from dual
  union 
  select '1532' as x from dual
  union 
  select '18017' as x from dual
) order by x;

Фактический результат:

x
-----
11117
12988
14659
1532
18017

Желаемый результат:

x
-----
1532
11117
12988
14659
18017

Вопрос:

Есть ли NLS настройки, которые помогут мне достичь желаемого результата? Я знаю, что могу сделать order by to_number(x) или даже лучше, order by lpad(x, 5), но это не хорошо в этом случае - мне нужно общесистемное решение, которое не потребует изменения запроса.

Что я пробовал:

  • order by nlssort(x, 'nls_sort=binary');
  • alter session set nls_sort='binary';

1 ответ

Возможно, несколько странное решение, но...

  1. Переименуйте ваш TABLE_SOMETHING в TABLE_OTHER.
  2. Создайте представление TABLE_SOMETHING поверх TABLE_OTHER, которое будет TO_NUMBER() с вашим столбцом проблемной строки с тем же именем столбца.
  3. Если таблица для всего приложения модифицируется, то создайте триггеры INSTEAD OF над представлением TABLE_SOMETHING.
  4. Перекомпилируйте возможно недействительные пакеты.

Не будет особенно эффективен, когда дело доходит до изменения большого количества записей, не позволит усечь таблицу, но это может решить проблему с упорядочением.

Другие вопросы по тегам