Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Сортировка букв и цифр  [new]
Kublakhan
Member

Откуда:
Сообщений: 3
Здравствуйте,

столкнулся с такой неожиданной проблемой:

почему-то при сортировке (Order by) латинские буквы идут перед цифрами, то есть результат селекта выглядит как
SQL> select * from t2 order by tcol asc;

TCOL
-------------------------------------------
$
A
B
1

Я проверил это на двух серверах базы Oracle 9.2 на Windos и Linux,
и в обоих случаях результат селекта одинаков.
Можно ли как-то объяснить Oracle что цифры идут перед буквами а не наоборот?

Заранее спасибо,

Вадим
22 сен 05, 11:38    [1900908]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Посмотри и поправь параметр 'NLS_SORT'
напр.
dbms_session.set_nls('NLS_SORT','BINARY');
22 сен 05, 11:45    [1900947]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
Kublakhan
Member

Откуда:
Сообщений: 3
Спасибо!
Только вот интересно как индексы в этом случае работают.
22 сен 05, 12:05    [1901054]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Kublakhan
Спасибо!
Только вот интересно как индексы в этом случае работают.


Для сортировки индексы не используются. Точнее они могут использоваться, когда порядок сортировки совпадает с порядком записей в индексе. В остальных случаях ключи перекодируются и сортируются в новом порядке.

В связи с этим у моего коллеги была грустная история.

Выводил он на печать длинный список. Список он формировал "на лету" непосредственно SQL запросом. Время от времени печать прерывалась, и её приходилось запускать снова. Чтобы не печатать второй раз то, что уже напечаталось он сделал так:

select .... where :last_printed < customer_name order by customer_name

В результате он обошёл своим драгоценным вниманием ряд клиентов.
22 сен 05, 12:15    [1901116]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
Kublakhan
Member

Откуда:
Сообщений: 3
mcureenab

Для сортировки индексы не используются. Точнее они могут использоваться, когда порядок сортировки совпадает с порядком записей в индексе. В остальных случаях ключи перекодируются и сортируются в новом порядке.

А ну точно, туплю.
Очень уж меня удивила такая сортировка символов в Oracle :(
22 сен 05, 12:50    [1901288]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
TRust
Member

Откуда: из самоизоляции
Сообщений: 286
При установленной бинарной сортировке, она осуществляется по кодам символов алфавита, а значит, зависит от установленной кодировки базы данных. К примеру, в кодировке CL8MSWIN1251 цифры идут впереди букв, сначала идут все заглавные буквы, а потом все строчные буквы, буква Ё идёт раньше всех других букв (в том числе и А).

При установленной русской сортировке, она всегда производится в соответствии с правилами русского алфавита, независимо от установленной кодировки. В частности, цифры идут после всех букв, заглав-ные и строчные буквы равноправны при сортировке, буква ё – на своём месте (между е и ж).

Однако иногда возникает потребность установить конкретный параметр сортировки, так как каждый имеет достоинства и недостатки. Дело в том, что индексы на данные сервер Oracle строит всегда в бинарном режиме. По этому, при установленной русской сортировке, даже при наличии индекса на столбцы сортировки, Oracle не будет использовать индекс для выборки данных, а каждый раз будет производить их сортировку. Некоторые запросы, которые при бинарном значении параметра отображают данные почти мгновенно, при русском значении параметра будут выдавать первые несколько строк ощутимое время, которое зависит от размера таблицы и количества выбираемых данных – вплоть до нескольких секунд, минут или часов.
22 сен 05, 15:00    [1902046]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
Stax.
Guest
TRust
....
По этому, при установленной русской сортировке, даже при наличии индекса на столбцы сортировки, Oracle не будет использовать индекс для выборки данных, а каждый раз будет производить их сортировку.
....


Вы уверены, что и для выборки ?

......
Stax
22 сен 05, 17:58    [1902948]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сортировка букв и цифр  [new]
Renatus
Member

Откуда: Москва
Сообщений: 10
Сегодня столкнулся с аналогичной проблемой, нашёл простое решение, переношу его сюда:
select * from t2 order by NLSSORT(tcol, 'NLS_SORT = BINARY_CI') asc
7 июн 10, 12:40    [8901476]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Renatus
Сегодня столкнулся с аналогичной проблемой, нашёл простое решение, переношу его сюда:
select * from t2 order by NLSSORT(tcol, 'NLS_SORT = BINARY_CI') asc
В чем конкретно заключалась та проблема, решение которой вы "перенесли сюда"?
7 июн 10, 14:02    [8902156]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
SQL*Plus
Renatus
Сегодня столкнулся с аналогичной проблемой, нашёл простое решение, переношу его сюда:
select * from t2 order by NLSSORT(tcol, 'NLS_SORT = BINARY_CI') asc
В чем конкретно заключалась та проблема, решение которой вы "перенесли сюда"?
И всё же, поясните, пожалуйста...
8 июн 10, 10:47    [8906411]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
Renatus
Member

Откуда: Москва
Сообщений: 10
SQL*Plus,

В теме обсуждается проблема сортировки, когда сортированные по VARCHAR2 строки выдаются в несколько непривычном порядке: сначала буквы, затем цифры. Поскольку я с такой проблемой ранее не сталкивался, полез искать в интернете. На SQL.RU наткнулся на эту тему, где у автора была приблизительно такая же проблема. В вышеизложенных комментариях предлагалось решение проблемы путём установки параметра 'NLS_SORT' в 'BINARY'. Но при распределённых транзакциях это сделать нельзя, и нашлось другое решение этой проблемы — сортировать с использованием функции NLSSORT. Чтобы, возможно, помочь тем, кто столкнётся с подобной небольшой проблемой, я добавил комментарий в эту же тему, вот и всё. :)
8 июн 10, 15:14    [8909112]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Да, цифры в вашем варианте стали выдаваться раньше букв.
Несколько непривычный порядок, получаемый при сортировке без учета регистра (_CI) вас "не напугали"?

SQL> WITH t AS (
  2     SELECT 'Яша' AS w FROM dual UNION ALL
  3     SELECT 'Вася' AS w FROM dual UNION ALL
  4     SELECT 'яша' AS w FROM dual UNION ALL
  5     SELECT 'World' AS w FROM dual UNION ALL
  6     SELECT 'world' AS w FROM dual UNION ALL
  7     SELECT 'Аня' AS w FROM dual UNION ALL
  8     SELECT 'аня' AS w FROM dual UNION ALL
  9     SELECT 'вася' AS w FROM dual UNION ALL
 10     SELECT 'ёжик' AS w FROM dual UNION ALL
 11     SELECT 'вася' AS w FROM dual UNION ALL
 12     SELECT 'Ёжик' AS w FROM dual UNION ALL
 13     SELECT 'ёжик' AS w FROM dual UNION ALL
 14     SELECT '7ша' AS w FROM dual)
 15  SELECT * FROM t
 16  ORDER BY NLSSORT(w, 'NLS_SORT=BINARY_CI');

W
-----
7ша
World
world
Ёжик
ёжик
ёжик
Аня
аня
вася
Вася
вася
яша
Яша
13 rows selected.
8 июн 10, 17:48    [8910540]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка букв и цифр  [new]
Renatus
Member

Откуда: Москва
Сообщений: 10
Не напугали, поскольку в моём случае регистр был не важен. :)
16 июн 10, 10:26    [8948368]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить