Проблемы с сортировкой ...

Сортировщик
Дата: 30.05.2006 13:05:34
Необходимо сделать сортировку по номеру квартир, но тип varchar2.
Поэтому получаем после сортировки - 1, 10, 100, 101, 102, ..., 11, 110 и т.д.
а нужно - 1, 2, 3, 4, 5 и т.д., т.е все проблемы из-за varchar2.
Причем встречаются значения 2а, 3б.
Возможно ли отсортировать данный столбец как числа или нет?
iV@n
Дата: 30.05.2006 13:10:37
на счет а, б и т.п. не уверен, но можно попробывать
order by lpad(номер_дома, max(длина номера дома), '0')
andrey_anonymous
Дата: 30.05.2006 13:12:46
Сортировщик
Необходимо сделать сортировку по номеру квартир, но тип varchar2.
Поэтому получаем после сортировки - 1, 10, 100, 101, 102, ..., 11, 110 и т.д.
а нужно - 1, 2, 3, 4, 5 и т.д., т.е все проблемы из-за varchar2.
Причем встречаются значения 2а, 3б.
Возможно ли отсортировать данный столбец как числа или нет?

order by lpad(flat,6,'0')
Q u a d r o
Дата: 30.05.2006 13:13:41
Один из вариантов - сделать все строки одинаковой длины:

SQL> select * from test order by a;

A
----------
1
100
101
234

8 rows selected.

SQL> select *
  2   from test
  3   order by substr('000000'||a, -6);

A
----------
1
2
3
4
2а
3б
100
101

8 rows selected.
Владимор Конев
Дата: 30.05.2006 13:15:01
Ну или отсечь буквы от цифр и отсортировать как число :)
Тынц
dmidek
Дата: 30.05.2006 13:18:46
Q u a d r o
A
----------
1
2
3
4


100
101

8 rows selected.[/src]


2 Q u a d r o: Как то оно плохо отсортировало
andrey_anonymous
Дата: 30.05.2006 13:25:01
dmidek
2 Q u a d r o: Как то оно плохо отсортировало

Более-менее правиллный ответ пока только у Владимора Конева
Stax.
Дата: 30.05.2006 15:49:14
andrey_anonymous
dmidek
2 Q u a d r o: Как то оно плохо отсортировало

Более-менее правиллный ответ пока только у Владимора Конева

имхо х-цию надо

а ежели так
select
 str
,translate(str, '0' || translate(str, '_1234567890', '_'), '0') tr
,lpad(str,15+nvl(length(ltrim(str,'0123456789')),0),'0') l from
(select '1a2' str from dual union all
 select '2' str from dual union all
 select '10' str from dual union all
 select '111' str from dual union all
 select '10b' str from dual
)
order by 3
SQL> /

STR TR  L
--- --- --------------------
1a2 12  000000000000001a2
2   2   000000000000002
10  10  000000000000010
10b 10  000000000000010b
111 111 000000000000111

.....
stax
M_IV
Дата: 30.05.2006 16:06:24
SELECT k FROM
(
SELECT '1' k FROM dual
UNION ALL
SELECT '1a' k FROM dual
UNION ALL
SELECT '2a' k FROM dual
UNION ALL
SELECT '2' k FROM dual
UNION ALL
SELECT '100a' k FROM dual
UNION ALL
SELECT '100c' k FROM dual
UNION ALL
SELECT '2b' k FROM dual
UNION ALL
SELECT '100' k FROM dual
)
ORDER BY TO_NUMBER(TRANSLATE(k,'_qwertzuiopasdfghjklyxcvbnm', '_')), DECODE(TRANSLATE(k,'_1234567890', '_'),NULL,'0',TRANSLATE(k,'_1234567890', '_'))

K   
----
1   
1a  
2   
2a  
2b  
100 
100a
100c

8 rows selected.
Stax.
Дата: 30.05.2006 16:15:12
2 M_IV
....
SELECT '1a1' k FROM dual
UNION ALL
...
......
stax