powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UKRAINIAN и Сортировка
25 сообщений из 45, страница 1 из 2
UKRAINIAN и Сортировка
    #40124995
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Насколько я понял, решения, без танцев з бубном, для сортировки Украинского алфавита и цифр в Oracle не существует или я не нашел решения?
Код: plsql
1.
nlssort(FieldName, 'NLS_SORT = UKRAINIAN')

Не работает - цифры в конце списка.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125010
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни разу не использовал NLSSORT, подсказать компетентно не смогу.

Смогу ли скорректировать постановку задачи.

Нужен test case и ссылка на документацию , где описано поведение кода, и почему вы ожидаете другого поведения.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
Connected to Oracle Database 18c Express Edition Release 18.0.0.0.0 
Connected as user1@DBOFFICEXE

SQL> 
SQL> with t(s) as (
  2   select '1' from dual union all
  3   select '4' from dual union all
  4   select 'б' from dual union all
  5   select 'ё' from dual
  6  )
  7  select s from t order by nlssort(s, 'NLS_SORT = binary');

S
--
1
4
б
ё

SQL> 
SQL> with t(s) as (
  2   select '1' from dual union all
  3   select '4' from dual union all
  4   select 'б' from dual union all
  5   select 'ё' from dual
  6  )
  7  select s from t order by nlssort(s, 'NLS_SORT = russian');

S
--
б
ё
1
4

SQL> 

...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125016
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

тест кейс
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH abc AS (
SELECT ' ' str FROM DUAL UNION ALL
SELECT '!' FROM DUAL UNION ALL
SELECT '1' FROM DUAL UNION ALL
SELECT 'D' FROM DUAL UNION ALL
SELECT 'd' 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 'я' FROM DUAL)
SELECT
 str
FROM abc
ORDER BY str -- nlssort(str, 'NLS_SORT = UKRAINIAN')


Сортировка должна быть именно так как указано в "abc": Символы, Числа, Латинский алфавит, Украинский алфавит
Что имеется виду под ссылкой на документацию - не понял.
Другие СУБД, с которыми мне приходилось работать (MySql, MariaDb, MsSQL, MS Access, PostgreSQL), нормально справляються с этой задачей по умолчанию.
Скажу больше, они даже индексы могут использовать при сортировке, но не суть.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125025
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По сути это сортировка как при nls_sort=binary только с учетом символов Украинского алфавита.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125091
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сортировка должна быть

Что имеется виду под ссылкой на документацию - не понял.

Ссылка на документацию - пример у меня выше. И почему вы считаете, что _должно_ быть по-другому.

В вашем test case у меня на 18-й версии одинаковый результат при ORDER BY field и ORDER BY 'NLS_SORT = UKRAINIAN'. Вероятно, я плохо знаю этот диалект. Видимо, 'і' - это не английская буква, а украинская.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
Connected to Oracle Database 18c Express Edition Release 18.0.0.0.0 
Connected as user1@DBOFFICEXE

SQL> 
SQL> WITH abc AS (
  2  SELECT ' ' str FROM DUAL UNION ALL
  3  SELECT '!' FROM DUAL UNION ALL
  4  SELECT '1' FROM DUAL UNION ALL
  5  SELECT 'D' FROM DUAL UNION ALL
  6  SELECT 'd' 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)
 13  SELECT
 14   str
 15  FROM abc
 16  ORDER BY str -- nlssort(str, 'NLS_SORT = UKRAINIAN')
 17  ;

STR
---
!

D
d
А
а
І
і
Я
я
1

11 rows selected


SQL> WITH abc AS (
  2  SELECT ' ' str FROM DUAL UNION ALL
  3  SELECT '!' FROM DUAL UNION ALL
  4  SELECT '1' FROM DUAL UNION ALL
  5  SELECT 'D' FROM DUAL UNION ALL
  6  SELECT 'd' 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)
 13  SELECT
 14   str
 15  FROM abc
 16  ORDER BY nlssort(str, 'NLS_SORT = UKRAINIAN');

STR
---
!

D
d
А
а
І
і
Я
я
1

11 rows selected


SQL> 
SQL> WITH abc AS (
  2  SELECT ' ' str FROM DUAL UNION ALL
  3  SELECT '!' FROM DUAL UNION ALL
  4  SELECT '1' FROM DUAL UNION ALL
  5  SELECT 'D' FROM DUAL UNION ALL
  6  SELECT 'd' 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)
 13  SELECT
 14   str
 15  FROM abc
 16  ORDER BY nlssort(str, 'NLS_SORT = BINARY');

STR
---

!
1
D
d
І
А
Я
а
я
і

11 rows selected


SQL> 

...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125094
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm
Видимо, 'і' - это не английская буква, а украинская.
Именно так - Украинская.
Есть еще Її, Єє, Ґґ.
dmdmdm
И почему вы считаете, что _должно_ быть по-другому.
Потому, что так работают все другие программы, которые умеют сортировать текст. Потому что это логично, потому что это принято на всем постсоветском пространстве (думаю и большинстве стран мира), что сначала символы, потом цифры, потом буквы! Вот только Oracle - исключение. Он сортирует как ему хочется.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125098
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiWПотому, что так работают все другие программы, которые умеют сортировать текст.

Ну так зачем жрать кактус? Получайте из оракула данные как есть и потом сортируйте их другими программами.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125100
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW,

Я не совсем понял , вам нужен описанный порядок символов или описанный порядок символов при nls_sort=ukrainian ?
То что вы описываете очень похоже на multilingual сортировку
doc
testcase
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
SQL> alter session set nls_sort=ukrainian;

Session altered.

SQL> @ukr

PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_SORT                       UKRAINIAN
NLS_COMP                       BINARY


STR   ASCII_STR
---- ----------
!            33
             32
D            68
d           100
А         53392
а         53424
І         53382
і         53654
Я         53423
я         53647
1            49

11 rows selected.

SQL> alter session set nls_sort=generic_m;

Session altered.

SQL> @ukr

PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_SORT                       GENERIC_M
NLS_COMP                       BINARY


STR   ASCII_STR
---- ----------
             32
!            33
1            49
d           100
D            68
а         53424
А         53392
і         53654
І         53382
я         53647
Я         53423

11 rows selected.



Regards

Maxim
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125101
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
Потому, что так работают все другие программы, которые умеют сортировать текст. Потому что это логично, потому что это принято на всем постсоветском пространстве (думаю и большинстве стран мира), что сначала символы, потом цифры, потом буквы! Вот только Oracle - исключение. Он сортирует как ему хочется.
"все другие программы" сортируют как
Код: plsql
1.
nlssort(str, 'NLS_SORT = generic_m')


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with abc(str) as
(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 'б' from dual
 union all
 select '!' from dual
 union all
 select '0' from dual)
select str
from abc
order by nlssort(str, 'NLS_SORT = generic_m');


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
STR
---
!  
0  
б  
Б  
ґ  
Ґ  
є  
Є  

8 rows selected.

Если у тебя есть "более другая" программа - приведи пример.

Тебе же, насколько я понял, необходимо сохранить поведение как в binary. А именно чтоб заглавные буквы всегда шли перед строчными. В таком случае можно транслировать украинский алфавит в необходимый порядок.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var target varchar2
exec select listagg('\10'||to_char(level,'fm00')) within group (order by level) into :target from dual connect by level <= 33*2;
with abc(str) as
(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 'б' from dual
 union all
 select '!' from dual
 union all
 select '0' from dual)
select str
from abc
order by translate(str, 'АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯабвгґдеєжзиіїйклмнопрстуфхцчшщьюя', unistr(:target));


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
STR
---
!  
0  
Б  
Ґ  
Є  
б  
ґ  
є  

8 rows selected.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125115
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кобанчег,

Спасибо (дякую)! Про такую возможность не знал, но это и есть танцы з бубнами. :(
И без использования индексов.

Наверно, для многих случаев, меня устроит generic_m.
Ще раз дякую!
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125117
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
Про такую возможность не знал, но это и есть танцы з бубнами.
Покажи как ты получишь то же самое без танцев с бубном в других СУБД
SergiiW
Другие СУБД, с которыми мне приходилось работать (MySql, MariaDb, MsSQL, MS Access, PostgreSQL)
test-case

Здесь сортировка не такая как тебе необходио, не так ли?

Оракл даёт точно такой результат с помощью
Код: plsql
1.
2.
3.
select str
from abc
order by str collate generic_m;

Так что претензии к Ораклу не до конца ясны.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125119
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кобанчег,

А не все так радужно как я думал Похоже снова грабли.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH abc (str) AS (
SELECT '-' FROM DUAL UNION ALL
SELECT '1-а' FROM DUAL UNION ALL
SELECT '11' FROM DUAL UNION ALL
SELECT '1-' FROM DUAL UNION ALL
SELECT '1' FROM DUAL )
SELECT
 str
FROM abc
ORDER BY nlssort(str, 'NLS_SORT = generic_m')

Дает:
-
1
1-
11
1-а

Почему 11 идет раньше 1-а?
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125120
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну прочтите же, наконец, доку, смотреть больно на эти "эксперименты" ...
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125129
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
Почему 11 идет раньше 1-а?
Минуточку. Так что там в других СУБД и при чём здесь украинский?

collate "en_GB"
collate "en-GB-x-icu"
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125134
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiWПочему 11 идет раньше 1-а?

Потому что это "dictionary order" и он игнорирует знаки притыкания.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125150
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кобанчег,

Украинский тут точно не при чем. И второй пример сортирует правильно. MySql сортирует правильно по умолчанию. Как добиться такого в Oracle?
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125151
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
SergiiWПочему 11 идет раньше 1-а?

Потому что это "dictionary order" и он игнорирует знаки притыкания. Что такое знаки притыкания? Почему их нужно игнорировать? Как это исправить?
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125152
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все ответы тут:
Linguistic Sorting and Matching
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125154
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кобанчег
Покажи как ты получишь то же самое без танцев с бубном в других СУБД
Вот
Никаких танцев з бубнами. Все правильно по умолчанию.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125159
Asmodeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ORA21cORA18cMariaDB 10.6MySQL8PG14-----1-1-1-1-1-1-а1-а1-а1-а11111111111-аDDDDdddddDІІІАаАААаАЯЯЯІіаааіІяяяЯяіііяЯ"Правильным" объявлен MySQL, всем на него равняться?
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125164
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Asmodeus
"Правильным" объявлен MySQL, всем на него равняться?
Походу - да. :)
Как заставить правильно сортировать MariaDB, думаю, проблем нет - utf8_unicode_ci. Но не суть.
Итого. Сделать сортировку в порядке убывания Символи, Цифры, Латиница (Aa), Украинский алфавит (Aa) простым методом (без танцев с бубнами) не получиться? Наиболее близкое решение это использовать generic_m, но неверно (с моей точки зрения и моих пользователей ) сортирует при наличие "знаков притыкания" и сначала нижний регистр, потом верхний. Или я ошибаюсь и такую сортировку можно сделать?
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125167
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, мого для себя нового узнал про сортировку. Ранее такими деталями даже не заморачивался.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125168
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать.
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125169
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможное решение для моего случая(!)
Код: sql
1.
ORDER BY CASE WHEN REGEXP_LIKE(str, '^(\d|\W)') then 1 END, nlssort(str, 'NLS_SORT = UKRAINIAN')


Пример
...
Рейтинг: 0 / 0
UKRAINIAN и Сортировка
    #40125170
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
Можно сделать.
Как? Сделать отдельную таблицу сортировки для oracle? У меня нет таких знаний.
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / UKRAINIAN и Сортировка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]