Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разный порядок для order by и для min / 3 сообщений из 3, страница 1 из 1
28.04.2020, 16:11
    #39952411
ln123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный порядок для order by и для min
Добрый день, столкнулся со странной ситуацией
Есть запрос

Код: plsql
1.
2.
3.
4.
select min(t.c),max(t.c), min(t.c) keep (dense_rank first order by t.c) from 
(select '005' c from dual
union  all
select '0-39' from dual) t



в результате его выполнения неожиданно (во всяком случае для меня) получаем

MIN(T.C) MAX(T.C) MIN(T.C)KEEP(DENSE_RANKFIRSTOR 0-39 005 005

Если выполнить запрос
Код: plsql
1.
2.
3.
4.
5.
6.
select t.c
from 
(select '005' c from dual
union  all
select '0-39' from dual) t
order by t.c



То результат будет такой

C 005 0-39

Т.е. для order by минимальное значение '005', а для функции min почему-то '0-39'

В чем тут может быть дело?


Ради интереса выполнил такой же эксперимент под PostgreSQL там минимальное значение '005' что собственно и ожидалось
...
Рейтинг: 0 / 0
28.04.2020, 16:48
    #39952429
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный порядок для order by и для min
ln123,

nls_sort
Код: 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.
SQL> select min(t.c),max(t.c), min(t.c) keep (dense_rank first order by t.c) from
  2  (select '005' c from dual
  3  union  all
  4  select '0-39' from dual) t
  5  /

MIN( MAX( MIN(
---- ---- ----
0-39 005  0-39

SQL> select min(t.c),max(t.c), min(t.c) keep (dense_rank first order by NLSSORT(t.c, 'NLS_SORT = UKRAINIAN')) from
  2  (select '005' c from dual
  3  union  all
  4  select '0-39' from dual) t
  5  /

MIN( MAX( MIN(
---- ---- ----
0-39 005  005


SQL> ed
Wrote file afiedt.buf

  1  select min(t.c),max(t.c), min(t.c) keep (dense_rank first order by NLSSORT(t.c, 'NLS_SORT = BINARY')) from
  2  (select '005' c from dual
  3  union  all
  4* select '0-39' from dual) t
SQL> /

MIN( MAX( MIN(
---- ---- ----
0-39 005  0-39



....
stax
...
Рейтинг: 0 / 0
28.04.2020, 17:38
    #39952451
ln123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный порядок для order by и для min
Stax,

Спасибо, нашел в документации при значении NLS_COMP = BINARY (значение по умолчанию) и ANSI для min и max будет использовано бинарное сравнение, а для order by сравнение выполняется по правилам в NLS_SORT.

Довольно странное решение :(
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разный порядок для order by и для min / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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