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

Откуда:
Сообщений: 7076
SELECT *
FROM (
              SELECT 'c'   t FROM dual
    UNION ALL SELECT '(n)'   FROM dual
    UNION ALL SELECT 'r'     FROM dual
  ) t
ORDER BY t.t ASC
t
c
(n)
r
15 дек 10, 19:07    [9944699]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862

alter session set nls_sort=binary_ci;

Posted via ActualForum NNTP Server 1.4

15 дек 10, 19:09    [9944710]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
an0nym
Member

Откуда:
Сообщений: 7076
Denis Popov,

а так будет идти сортировка с учетом особенностей национального алфавита? Мне хочется, чтобы он просто не пропускал скобку и ставил такие записи в начало...
15 дек 10, 19:11    [9944718]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
order by replace(t.t, '(')
15 дек 10, 19:13    [9944726]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
an0nym
Member

Откуда:
Сообщений: 7076
брадобрей,

это не серьезно (c).
15 дек 10, 19:14    [9944729]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
_Alex_SMIRNOV_
Member

Откуда: Киев
Сообщений: 1519
ORDER BY NLSSORT(t.t, 'NLS_SORT = BINARY') ASC
15 дек 10, 19:16    [9944739]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
an0nym
Member

Откуда:
Сообщений: 7076
_Alex_SMIRNOV_, Denis Popov,

спасибо.
15 дек 10, 19:25    [9944762]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
an0nym
_Alex_SMIRNOV_, Denis Popov,

спасибо.

а мне Картинка с другого сайта.
15 дек 10, 19:33    [9944781]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
an0nym
Member

Откуда:
Сообщений: 7076
брадобрей,

спасибо за участие.
15 дек 10, 19:34    [9944788]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как отключить "умную" сортировку?  [new]
Pastic
Member

Откуда: Москва
Сообщений: 2183
У меня такой вопрос по сортировке символьных полей. Нужно сортировать сначала по спецсимволам, затем по цифрам, затем по английским буквам и после этого по русским буквам. По буквам - без учёта регистра.

Я пробовал следующие варианты:
BINARY_CI: некорректно сортирует русские буквы - буква ё - идёт после я (Я),
RUSSIAN_CI: после спецсимволов идут не цифры, а английские буквы,
GENERIC_BASELETTER_CI: русские буквы идут в неправильном порядке,
GERMAN_CI: после спецсимволов идут не цифры, а русские буквы.

Тест:
автор
select name_short
from
(select '(!)' name_short from dual union all
select '1' from dual union all
select '208' from dual union all
select 'б' from dual union all
select 'еёеё' from dual union all
select 'ЕЁЕЁ' from dual union all
select 'ёеё' from dual union all
select 'Щёеё' from dual union all
select 'www' from dual union all
select 'WWW' from dual union all
select 'www' from dual)
order by NLSSORT(name_short, 'NLS_SORT=RUSSIAN_CI')


Ещё я читал про Oracle Locale Builder, но хотел бы узнать, можно ли каким-либо образом в данном случае обойтись без него?

Сообщение было отредактировано: 16 ноя 21, 12:34
16 ноя 21, 12:34    [22396552]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
AmKad
Member

Откуда:
Сообщений: 5344
Pastic,

order by translate(from, what, to)
16 ноя 21, 12:39    [22396556]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
Pastic
Member

Откуда: Москва
Сообщений: 2183
AmKad
Pastic,

order by translate(from, what, to)


А как её применить в данном случае?
16 ноя 21, 12:48    [22396562]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
SQL> select name_short
  2  from
  3  (select '(!)' name_short from dual union all
  4  select '1' from dual union all
  5  select '208' from dual union all
  6  select 'б' from dual union all
  7  select 'еёеё' from dual union all
  8  select 'яёеё' from dual union all
  9  select 'ЕЁЕЁ' from dual union all
 10  select 'ёеё' from dual union all
 11  select 'Щёеё' from dual union all
 12  select 'щёеё' from dual union all
 13  select 'Йёеё' from dual union all
 14  select 'иёеё' from dual union all
 15  select 'Иёеё' from dual union all
 16  select 'йёеё' from dual union all
 17  select 'www' from dual union all
 18  select 'WWW' from dual union all
 19  select 'www' from dual)
 20  order by NLSSORT(name_short, 'NLS_SORT=UCA0700_DUCET_CI')
 21  ;

NAME_SHORT
----------
(!)
1
208
WWW
www
www
б
ёеё
ЕЁЕЁ
еёеё
иёеё
Иёеё
йёеё
Йёеё
Щёеё
щёеё
яёеё

17 rows selected


SQL> 
16 ноя 21, 14:11    [22396597]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
Pastic
Member

Откуда: Москва
Сообщений: 2183
andrey_anonymous
SQL> select name_short
  2  from
  3  (select '(!)' name_short from dual union all
  4  select '1' from dual union all
  5  select '208' from dual union all
  6  select 'б' from dual union all
  7  select 'еёеё' from dual union all
  8  select 'яёеё' from dual union all
  9  select 'ЕЁЕЁ' from dual union all
 10  select 'ёеё' from dual union all
 11  select 'Щёеё' from dual union all
 12  select 'щёеё' from dual union all
 13  select 'Йёеё' from dual union all
 14  select 'иёеё' from dual union all
 15  select 'Иёеё' from dual union all
 16  select 'йёеё' from dual union all
 17  select 'www' from dual union all
 18  select 'WWW' from dual union all
 19  select 'www' from dual)
 20  order by NLSSORT(name_short, 'NLS_SORT=UCA0700_DUCET_CI')
 21  ;

NAME_SHORT
----------
(!)
1
208
WWW
www
www
б
ёеё
ЕЁЕЁ
еёеё
иёеё
Иёеё
йёеё
Йёеё
Щёеё
щёеё
яёеё

17 rows selected


SQL> 


Спасибо, это почти то, что нужно - от требуемого варианта эта сортировка отличается лишь тем, что там буква "ё" находится не между "е" и "ж", а между "д" и "е".
16 ноя 21, 14:34    [22396603]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
Pastic


А как её применить в данном случае?


если нет подходящего нлс_сорт


Нужно сортировать
order by
translate(str,'не спецсимвол','**************') --по спецсимволам
,translate(str,'не цифры','00000000000') -- затем по цифрам
,translate(str,'не анг буквы','sssssssssssss') -- затем по английским буквам
,translate(str,'не рус буквы','шшшшшшшшшшш') --и после этого по русским буквам.

+upper/lower --По буквам - без учёта регистра.

ps
вместо translate регулярку

pss
упорядочивать по функции

.....
stax

Сообщение было отредактировано: 16 ноя 21, 15:32
16 ноя 21, 15:31    [22396618]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10337
Stax,
Тут сама задача или неясно определена или бред:

Автор: SY
Приложить+файл
Форум?


Вот какой смысл в сортировке по спецсимволам разбросанным где угодно?

SY.
16 ноя 21, 15:52    [22396630]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
Pastic
сортировка отличается лишь тем, что там буква "ё" находится не между "е" и "ж", а между "д" и "е".

Не човчем.
В UCA 7.0 DUCET "е" и "ё" - это одна базовая буква, они по дефолту не различаются.
Попробуйте подобрать устраивающий Вас вариант тут:
https://docs.oracle.com/en/database/oracle/oracle-database/18/nlspg/linguistic-sorting-and-matching.html#GUID-3D736236-BF98-4A4D-9D09-293AAA50A04E
16 ноя 21, 17:43    [22396655]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
andrey_anonymous
"е" и "ё" - это одна базовая буква, они по дефолту не различаются.

select name_short
from
(select 'Расчет' name_short from dual union all
select 'Расчёт' from dual union all
select 'РасчЕт' from dual union all
select 'РасчЁт' from dual union all
select 'Расчеты' name_short from dual union all
select 'Расчёты' from dual union all
select 'РасчЕты' from dual union all
select 'РасчЁты' from dual)
order by NLSSORT(name_short, 'NLS_SORT=UCA0700_DUCET_CI')
;

NAME_SHORT
--------------
РасчЕт   -- Регистронезависимая сортировка - е, ё, Е, Ё равнозначны и не сортируются (случайный порядок)
Расчет
Расчёт
РасчЁт
Расчеты  -- Расч{еёЕЁ}ты > Расч{еёЕЁ}т
РасчЕты
Расчёты
РасчЁты

8 rows selected

select name_short
from
(select 'Расчет' name_short from dual union all
select 'Расчёт' from dual union all
select 'РасчЕт' from dual union all
select 'РасчЁт' from dual union all
select 'Расчеты' name_short from dual union all
select 'Расчёты' from dual union all
select 'РасчЕты' from dual union all
select 'РасчЁты' from dual)
order by NLSSORT(name_short, 'NLS_SORT=UCA0700_DUCET_S3')
-- модификатор tetriary ввел определенность в порядок следования uppercase-lowercase, но сама буква {еЕёЁ} свое место в сортировке не поменяла:
;

NAME_SHORT
--------------
Расчет
РасчЕт
Расчёт
РасчЁт
Расчеты
РасчЕты
Расчёты
РасчЁты

8 rows selected


SQL> 


Сообщение было отредактировано: 16 ноя 21, 18:09
16 ноя 21, 18:07    [22396662]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
Правильный Вася
Member

Откуда:
Сообщений: 459
Oracle recommends that you do not use UCA 6.1 and 6.2 collations, nor the UCA0700_DUCET and UCA0700_ROOT collations.
16 ноя 21, 18:57    [22396673]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
AmKad
Member

Откуда:
Сообщений: 5344
Stax

Нужно сортировать
order by
translate(str,'не спецсимвол','**************') --по спецсимволам
,translate(str,'не цифры','00000000000') -- затем по цифрам
,translate(str,'не анг буквы','sssssssssssss') -- затем по английским буквам
,translate(str,'не рус буквы','шшшшшшшшшшш') --и после этого по русским буквам.
А почему не сделать одним translate-ом на фиксированном nls_sort?

Сообщение было отредактировано: 16 ноя 21, 20:40
16 ноя 21, 20:39    [22396687]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить "умную" сортировку?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
Правильный Вася
Oracle recommends that you do not use UCA 6.1 and 6.2 collations, nor the UCA0700_DUCET and UCA0700_ROOT collations.

Цитировать следует полностью.
17 ноя 21, 13:22    [22396952]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить