to_char(number) - подставить формат поля таблицы

andreymx
Дата: 03.08.2005 17:35:54
Перевести число в строку - без проблем
Только в отличие от, скажем, клиппера, все пробелы по умолчанию обрезаются.
Сделать нужной ширины - тоже не проблема: to_char(field, '9999') (правда, всё равно один пробел лишний - блин, ни в одном языке больше не встречал!)
А как бы несложно сделать, чтобы при изменении размерности field и маска ('9999') изменилась?
Это возможно без залезания в all_field_columns?
Пример: выдается код+наименование
SELECT TO_CHAR(str, '99') || ' ' || name note FROM NSI1404
Что бы такое подставить вместо '99'?
Это надо для сортировки (нежелательно в запрос вставлять поле str, т.к. там еще есть куча UNION и не все коды - числа)
С уважением, АндрейМх
1
Дата: 03.08.2005 17:39:30
Может, определиться один раз с шириной и использовать что-то типа LPAD(TO_CHAR(...))?
Tolmachov Dmitiry
Дата: 03.08.2005 17:40:34
Используй to_char без маски.

to_char(field) 
********
Дата: 03.08.2005 18:11:47
RTFM
если я тебя правильно понял, то пишешь
to_char(field, 'fm999,999,999,999.99') с маской максимального размера, лишних пробелов не будет
SY
Дата: 03.08.2005 18:46:01
andreymx
Сделать нужной ширины - тоже не проблема: to_char(field, '9999') (правда, всё равно один пробел лишний - блин, ни в одном языке больше не встречал!)


That пробел лишний is sign. By default TO_CHAR will prefix number to string conversion result with "-" if number is negative and with space otherwise. It is quite convinient when you display mixed (both negative and positive numbers) since corresponding digits remain lined up:

SQL> select to_char(power(-1,mod(rownum,2))*rownum/(count(*) over()),'0.9999') from emp;

TO_CHAR
-------
-0.0714
 0.1429
-0.2143
 0.2857
-0.3571
 0.4286
-0.5000
 0.5714
-0.6429
 0.7143
-0.7857

TO_CHAR
-------
 0.8571
-0.9286
 1.0000

14 rows selected.

SQL> select to_char(power(-1,mod(rownum,2))*rownum/(count(*) over()),'fm0.9999') from emp;

TO_CHAR
-------
-0.0714
0.1429
-0.2143
0.2857
-0.3571
0.4286
-0.5
0.5714
-0.6429
0.7143
-0.7857

TO_CHAR
-------
0.8571
-0.9286
1.

14 rows selected.

SQL> 

As you can see, in this case format modifier fm messed up allignment.

SY.
***********
Дата: 03.08.2005 19:32:08
to SY: i think one of us misunderstood the question.
SY
Дата: 03.08.2005 20:02:29
автор
to SY: i think one of us misunderstood the question


Well, I just explained logic behind the extra space to answer
andreymx
правда, всё равно один пробел лишний - блин, ни в одном языке больше не встречал!
portion of the posting.

SY.
hell
Дата: 03.08.2005 23:38:56
SY

That пробел лишний is sign.
SY.


Можно составлять список крылатых выражений м-ра SY

по топику - непонятно, sql составляется динамически очевидно? тогда можно вытягивать размер колонки. Иначе почему сразу не указать правильную маску? или размерность меняется в процессе работы?
andreymx
Дата: 04.08.2005 09:05:36
hell
по топику - непонятно, sql составляется динамически очевидно? тогда можно вытягивать размер колонки. Иначе почему сразу не указать правильную маску? или размерность меняется в процессе работы?
sql составляется не динамически, а всего один раз, и правильную маску несложно вычислить - но не хотелось бы её корректировать, если размерность изменится (UNION из 4 разных таблиц, строится дерево - объект, для которого нужен запрос именно в таком виде).
SELECT 'nsi1400'||vid_rasx id, vid_rasx || '-' || name note, '' id_parent FROM NSI1400
UNION ALL
SELECT 'nsi1401'||id_raz id,  to_char(raz, '99')|| '-' || name note, 'nsi1400'||vid_rasx id_parent FROM NSI1401
UNION ALL
SELECT 'nsi1403'||id_st id,  to_char(st, '999')|| '-' || naim_st note, 'nsi1401'||id_raz id_parent FROM NSI1403
UNION ALL
SELECT 'nsi1404'||id_nsi1404 id,to_char(str, '999')|| '-' ||naim_str note, 'nsi1403'||id_st id_parent FROM NSI1404
ORDER BY id_parent nulls first, note
Vint
Дата: 04.08.2005 09:15:02
может быть вам поможет
select to_char(123.33,'TM9') from dual
select to_char(1123.33,'TM9') from dual