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

Не работает - цифры в конце списка.
...
Рейтинг: 0 / 0
06.01.2022, 19:03
    #40125010
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UKRAINIAN и Сортировка
Ни разу не использовал 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
06.01.2022, 19:18
    #40125016
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UKRAINIAN и Сортировка
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
06.01.2022, 19:50
    #40125025
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UKRAINIAN и Сортировка
По сути это сортировка как при nls_sort=binary только с учетом символов Украинского алфавита.
...
Рейтинг: 0 / 0
07.01.2022, 12:40
    #40125091
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UKRAINIAN и Сортировка
Сортировка должна быть

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

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

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

Ну так зачем жрать кактус? Получайте из оракула данные как есть и потом сортируйте их другими программами.
...
Рейтинг: 0 / 0
07.01.2022, 13:56
    #40125100
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UKRAINIAN и Сортировка
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
07.01.2022, 13:56
    #40125101
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UKRAINIAN и Сортировка
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
07.01.2022, 15:11
    #40125115
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UKRAINIAN и Сортировка
Кобанчег,

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

Наверно, для многих случаев, меня устроит generic_m.
Ще раз дякую!
...
Рейтинг: 0 / 0
07.01.2022, 15:23
    #40125117
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UKRAINIAN и Сортировка
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
07.01.2022, 15:39
    #40125119
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UKRAINIAN и Сортировка
Кобанчег,

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

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

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

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

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


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


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