order by nomer - когато е стринг

9 отговора 0 прегледа
#1

order by nomer - когато е стринг

Работя с Firebird 1.5 създал съм поле(varchar) за номер на документ. Грешката ми е при проектирането-трябваше да е Integer. Сега си бера последствията-
не мога да сортирам по този номер, защото 10 го слага преди 3, защото почва с едно. Не мога да дропна полето и да го създам наново с правилния тип, защото клиентите работят отдавна и са писали много данни.
Има ли измъкване от ситуацията? Или да отписвам "order by" за това поле?

Отговор
в отговор на 123 #2

Re: order by nomer - когато е стринг

добавяш поле тип Int.
Копираш съдържанието от едното в другото поле - в MySQL - няма да имаш грижи - за фиребърд - не знам.
Дропваш полето което не ти трябва, перименуваш Инт полето - и си в бизнеса :)
Е преди началото на упражненията - задължително архивно копие.

Bеer? Mоre?
Плацебото
Отговор
в отговор на 123 #3

cast + view

Правиш си view, кастваш до integer и след това си бачкаш с view-то, където можеш да сортираш както си искаш ...

Отговор
в отговор на Heh #4

Re: cast + view

не, по-добрият вариант е на бирата.

Отговор
в отговор на 123 #5

Re: order by nomer - когато е стринг

select cast(typoto_pole as integer), drugi_poleta
from tablicite
order by 1

Time is like a drug, too much of it kills you
Отговор
в отговор на 123 #6

Re: order by nomer - когато е стринг

хм, в MySQL има една команда, която се казва:
ALTER TABLE,
твърде сигурен съм че я има във всяка нормална база от данни ...
и ако във въпросното поле наистина има само цифри то съвсем спокойно, мисля ще мине един обикновен:
ALTER TABLE table_name CHANGE old_col_name column_definition
naprimer
ALTER TABLE test CHANGE nomer_doc nomer_doc INT not null default 0
....
Онези упражнения за премятаници, за цастове, за view-ta смятам че са излишни ...

Отговор
в отговор на bandy #7

Re: order by nomer - когато е стринг

Така обаче може да е... мамата на данните.

Bеer? Mоre?
Плацебото
Отговор
в отговор на bandy #8

Re: order by nomer - когато е стринг

В оракула не е така.
За да направиш ALTER TABLE table_name MODIFY strFIELD NUMBER(5)
ще ти изгърми с грешка ora-01439, т.е че колоната трябва да ти е празна.
Решението е както е писал Бирата по-горе.
Правиш ново поле number(10) примерно. Копираш там всичко от стринг полето. Предварително обаче всички данни ги конвертираш към number. И там ще стане красотата.
10 6 и 106 с конвертиране към number ще ти гръмне (to_number).
Ако пък не - всичко е просто, лесно и пей сърце....

П.С. Обаче от моят опит никога не е така.

Отговор
в отговор на AйeзCeдaй #9

Re: order by nomer - когато е стринг

И в Interbase не може с alter table да се смени varchar с integer. Може само да се смени с по-"голям" varchar.
Ако има тригери или stored процедури които ползват въпросното поле не може и да го дроп-не, ще даде грешка че има dependencies. Ако са само няколко тригери/процедури може временно да ги дроп-не, да проложи варианта на бирата и после пак да ги сложи, но ако са повече става доста трудоемко.
Между другото варианта на бирата няма да работи, Интербейс не дава да се преименува полето, трябва да си направи ново поле тип integer, да си копира данните там, да дроп-не старото поле, после да създаде ново поле пак тип integer и със същото име като старото, пак да копира всичко и да изтрие накрая излишното.

Time is like a drug, too much of it kills you

Редактирано от killall на

Отговор
в отговор на killall #10

Re: order by nomer - когато е стринг

Именно, това ми беше идеята, но не съм я описала, написала като хората

Отговор