Дополнение нулями до нужного количества символов
Добавлено: 03 янв 2007, 16:12
Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Форум по InterBase, Firebird и Yaffil
http://ibaseforum.ru/
Естественно, не считая пробеловSolo писал(а):Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Ну, способ дурацкий, но уж точно сработает (FKEY_WIDTH = входной параметр, до какой длины дополнять):Solo писал(а):Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Код: Выделить всё
if (:FKEY_WIDTH>=10 and :NEXT_NUM<1000000000) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 9 and :NEXT_NUM<100000000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 8 and :NEXT_NUM<10000000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 7 and :NEXT_NUM<1000000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 6 and :NEXT_NUM<100000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 5 and :NEXT_NUM<10000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 4 and :NEXT_NUM<1000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 3 and :NEXT_NUM<100 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 2 and :NEXT_NUM<10 ) then NEXT_NUM = '0'|| NEXT_NUM;
Да, конечно в триггере, поэтому я и написал в эту ветку "Проектирование БД и запросов"... Кроме того, не CHAR, конечно, а VARCHAR. Это я переношу базу с MySQLmdfv писал(а):Можно было бы и поконкретней спросить.
Если "перед постингом" имеется ввиду метод dataset.Post в клиентской программе, то проблем наверное нет.
Если в триггере на вставку/измение то длину можно узнать примерно так:
char_length(trim(charfield))
хотя может правильнее так: char_length(trim(cast(charfield as varchar(6))))
Правильнее наверное так:konstb писал(а):Код: Выделить всё
if (:FKEY_WIDTH>=10 and :NEXT_NUM<1000000000) then NEXT_NUM = '0'|| NEXT_NUM;
Код: Выделить всё
if (:FKEY_WIDTH>=10 and Cast(:NEXT_NUM as integer)<1000000000) then NEXT_NUM = '0'|| NEXT_NUM;
Код: Выделить всё
s1='000000000';
s2=trim(charfield);
flen=char_length(s2) ;
charfield=substring(s1 from 1 for (6-flen))||s2;
Код: Выделить всё
CREATE PROCEDURE addzero (
inchar varchar(6))
returns (
outchar varchar(6))
as
declare variable flen integer;
declare variable s1 varchar(6);
declare variable s2 varchar(6);
begin
s1='000000';
s2=trim(inchar);
flen=char_length(s2) ;
outchar=substring(s1 from 1 for (6-flen))||s2;
suspend;
end
Код: Выделить всё
select OUTCHAR from ADDZERO(new.charfield)
into
new.charfield;
Код: Выделить всё
AS
begin
while ( char_length(trim(new.ncont)) < 4) do /*ну, или меньше 6-ти*/
begin
new.ncont = '0'||new.ncont;
end
end
Зато в любой версии действует LIKE:Кажется, чар_лейт действует только в FireBirde 2.0
Код: Выделить всё
while (not new.ncont like '_______%') do
Не понял... а что, в лайке можно маску задать, что ли? Имеется в виду, если количество знаков меньше 4-х...Dimitry Sibiryakov писал(а):Зато в любой версии действует LIKE:Кажется, чар_лейт действует только в FireBirde 2.0Код: Выделить всё
while (not new.ncont like '_______%') do
Стыдно признаться, но я думал, что лайк - чтобы по части слова условие задать... Ну, типа "%ров"Dimitry Sibiryakov писал(а):По-моему лайк только из-за масок и держат. Иначе на кой он нужен?..
Двумя подставными символами: '_' и '%'. Первый подменяет один любой символ, второй - любое число любых символов.Solo писал(а):И как же в нем маску можно задать?
Тока что попробовал. правда на МуSQL. РаботаетEvilsInterrupt писал(а):2 Dimitry Sibiryakov:
Не мог ли бы ты показать самый хитрый трюк с этим оператором LIKE, который когда-либо видел или применял?