powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dense_rank проверяет только первые 1000 символов?
14 сообщений из 14, страница 1 из 1
dense_rank проверяет только первые 1000 символов?
    #39584114
fanat000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!

в общем возникла необходимость пронумеровать строки в зависимости от содержания некого поля MyText Varchar2(4000).

... dense_rank() over(order by MyText )

в рабочей базе оказались в наличии две строки, у которых значение в MyText более 1000 символов длиной, при этом первые 1000 совпадают, а дальше текст совершенно разный.

по логике строки разные и dense_rank должна вернуть разные значения, но нет!

ЧЯДНТ?

пример (воспроизводится в ORACLE 11.0.2):

Код: sql
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.
select 

dense_rank() over(order by text) "dense_rank", 
rank() over(order by text) "rank", 
row_number() over(order by text) "row_number", 
length(text)"length", t.*
from
(
select 1 x, '0000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000vxvvxjty5' text from dual

union 
select 2 x, '0000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000frgegeg' text from dual
)t
order by x
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584116
fanat000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dense_rank rank row_number length X TEXT
1 1 2 1008 1 0000000000000000000000000000000000000000...
1 1 1 1018 2 0000000000000000000000000000000000000000...

вот такие дела.
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584128
fanat000,

вот тебе же не лениво было столько нулей набивать. LPAD/RPAD - это для лохов, наверное?
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584134
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ha 11.2.0.3 (11.2.0.2 не имею и проверить не могу) не воспроизводится:

Код: 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> select banner from v$version
  2  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for 64-bit Windows: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

SQL> select
  2  dense_rank() over(order by text) "dense_rank",
  3  rank() over(order by text) "rank",
  4  row_number() over(order by text) "row_number",
  5  length(text)"length", x
  6  from
  7  (
  8  select 1 x, '0000000000000000000000000000000000000000000000000000000000000000000000
  9  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 10  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 11  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 12  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 13  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 14  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 15  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 16  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 17  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 18  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 19  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 20  0000vxvvxjty5' text from dual
 21  union
 22  select 2 x, '0000000000000000000000000000000000000000000000000000000000000000000000
 23  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 24  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 25  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 26  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 27  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 28  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 29  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 30  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 31  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 32  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 33  00000000000000000000000000000000000000000000000000000000000000000000000000000000000
 34  0000000000000000frgegeg' text from dual
 35  )t
 36  order by x
 37  /

dense_rank       rank row_number     length          X
---------- ---------- ---------- ---------- ----------
         2          2          2       1008          1
         1          1          1       1018          2

SQL> 



SY.
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584136
SY,

у меня на

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
"CORE 11.2.0.4.0 Production"
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

результат соответствует тому, что у ТС:

Код: plsql
1.
2.
3.
4.
dense_rank       rank row_number     length          X
---------- ---------- ---------- ---------- ----------
         1          1          2       1008          1
         1          1          1       1018          2
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584137
Добрый Э - Эх,

на
Код: plsql
1.
2.
3.
4.
5.
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
"CORE	10.2.0.5.0	Production"
TNS for 64-bit Windows: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production



результат аналогичный....
Код: plsql
1.
2.
3.
4.
dense_rank       rank row_number     length          X
---------- ---------- ---------- ---------- ----------
         1          1          2       1008          1
         1          1          1       1018          2
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584145
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584147
mssql--2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
глюков нету
Код: sql
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.
SELECT 
       DENSE_RANK() OVER(ORDER BY text) "dense_rank", 
       RANK() OVER(ORDER BY text) "rank", 
       row_number() OVER(ORDER BY text) "row_number", 
       LEN(text)"length", T.*
  FROM
(
SELECT 1 x, '0000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000vxvvxjty5' text 

UNION 
SELECT 2 x, '0000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000frgegeg' text 
) T
ORDER BY x
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584149
fanat000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эхfanat000,

вот тебе же не лениво было столько нулей набивать. LPAD/RPAD - это для лохов, наверное?

а с LPAD при 1000 не воспроизводится;-)

поигрался, вот так снова "глючит":

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 

dense_rank() over(order by text) "dense_rank", 
rank() over(order by text) "rank", 
row_number() over(order by text) "row_number", 
length(text)"length", t.*
from
(
select 1 x, lpad('000000vxvvxjty5', 1051, '0') text from dual
union 
select 2 x, lpad('0000000000frgegeg', 1051, '0') text from dual
)t
order by x
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584153
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584154
fanat000,

ты его просто неправильно готовишь.... Нужно ведь чтобы строка была не 1000 байт длиной, а чуть больше....

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 

dense_rank() over(order by text) "dense_rank", 
rank() over(order by text) "rank", 
row_number() over(order by text) "row_number", 
length(text)"length", t.*
from
(
select 1 x, lpad('0', 1000, '0')||'vxvvxjty5' text from dual
union 
select 2 x, lpad('0', 1000, '0')||'frgegeg' text from dual
)t
order by x
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584243
fanat000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо всем за участие,
в будущем буду иметь ввиду данный нюанс.
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584244
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fanat000,

dense_rank() over(order
by text,substr(text,1000),substr(text,1999),substr(text,2998),substr(text,3997)) "dense_rank",


....
stax
...
Рейтинг: 0 / 0
dense_rank проверяет только первые 1000 символов?
    #39584251
fanat000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+1
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dense_rank проверяет только первые 1000 символов?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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