Сортировка оракула с текстом как число
мой 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 ответ
Возможно, несколько странное решение, но...
- Переименуйте ваш TABLE_SOMETHING в TABLE_OTHER.
- Создайте представление TABLE_SOMETHING поверх TABLE_OTHER, которое будет TO_NUMBER() с вашим столбцом проблемной строки с тем же именем столбца.
- Если таблица для всего приложения модифицируется, то создайте триггеры INSTEAD OF над представлением TABLE_SOMETHING.
- Перекомпилируйте возможно недействительные пакеты.
Не будет особенно эффективен, когда дело доходит до изменения большого количества записей, не позволит усечь таблицу, но это может решить проблему с упорядочением.