Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как учесть NLS_SORT при взятии min() и max() от строки? / 4 сообщений из 4, страница 1 из 1
28.11.2021, 00:38
    #40115604
yon_brover
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как учесть NLS_SORT при взятии min() и max() от строки?
Как известно, в зависимости от NLS_SORT имеет место различный порядок сортировки строк.
Например, у меня на сервере при NLS_SORT=BINARY символ 'M' идёт по порядку раньше, чем 'f':
Код: plsql
1.
2.
3.
4.
5.
SQL> select a from (select 'M' a from dual union all select 'f' a from dual) order by NLSSORT(a, 'NLS_SORT=BINARY');
A
-
M
f



А при NLS_SORT=LATIN символ 'f' идёт по порядку раньше, чем 'M':
Код: plsql
1.
2.
3.
4.
5.
SQL> select a from (select 'M' a from dual union all select 'f' a from dual) order by NLSSORT(a, 'NLS_SORT=LATIN');
A
-
f
M



Теперь давайте попробуем взять min() от строки при различных значениях NLS_SORT:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL> ALTER SESSION SET NLS_SORT=BINARY;
Session altered

SQL> select min(a) from (select 'M' a from dual union all select 'f' a from dual);
MIN(A)
------
M



Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL> ALTER SESSION SET NLS_SORT=LATIN;
Session altered

SQL> select min(a) from (select 'M' a from dual union all select 'f' a from dual);
MIN(A)
------
M



Итак, min() выдал одно и то же значение, отсортировав строки, судя по результату, в порядке NLS_SORT=BINARY
NLS_SORT бывает либо BINARY либо linguistic_definition.
Можно ли заставить min() определять минимум из строк согласно порядку linguistic_definition?
...
Рейтинг: 0 / 0
28.11.2021, 01:30
    #40115614
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как учесть NLS_SORT при взятии min() и max() от строки?
Логично, что MAX() не требует сортировки. Поэтому NLS_SORT на него не влияет.
Совсем другое дело NLS_COMP...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.11.2021, 01:41
    #40115616
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как учесть NLS_SORT при взятии min() и max() от строки?
Попробуйте функцию NLSSORT.
Может это то, что вам нужно.

Код: 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.
SQL> select min(a) from (select 'Ж' a from dual union all select 'б' a from dual);

M
-
Ж

SQL> 
SQL> select NLSSORT('Ж') AS a, 'Ж' AS let from dual 
  2        union all 
  3        select NLSSORT('б'), 'б' from dual;

A        L
-------- -
A0000100 Ж
8E000200 б

SQL> 
SQL> select SYS_CONTEXT('userenv', 'NLS_SORT') as nls_sort
  2       , min(a) AS min_a
  3  from (select NLSSORT('Ж') AS a, 'Ж' AS let from dual 
  4        union all 
  5        select NLSSORT('б'), 'б' from dual);

NLS_SORT        MIN_A   
--------------- --------
RUSSIAN         8E000200
...
Рейтинг: 0 / 0
28.11.2021, 01:53
    #40115618
yon_brover
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как учесть NLS_SORT при взятии min() и max() от строки?
Спасибо. Да, NLS_COMP отвечает за порядок при выборе min() и при NLS_COMP=LINGUISTIC порядок наследуется от NLS_SORT.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> ALTER SESSION SET NLS_SORT=LATIN;
Session altered
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC;
Session altered
SQL> select min(a) from (select 'M' a from dual union all select 'f' a from dual);
MIN(A)
------
f



Код: plsql
1.
2.
3.
4.
5.
6.
SQL> ALTER SESSION SET NLS_COMP=BINARY;
Session altered
SQL> select min(a) from (select 'M' a from dual union all select 'f' a from dual);
MIN(A)
------
M
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как учесть NLS_SORT при взятии min() и max() от строки? / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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