Дополнение нулями до нужного количества символов

Модераторы: kdv, CyberMax

Ответить
Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Дополнение нулями до нужного количества символов

Сообщение Solo » 03 янв 2007, 16:12

Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Re: Дополнение нулями до нужного количества символов

Сообщение Solo » 03 янв 2007, 17:55

Solo писал(а):Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Естественно, не считая пробелов

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2007, 21:29

Можно было бы и поконкретней спросить.
Если "перед постингом" имеется ввиду метод dataset.Post в клиентской программе, то проблем наверное нет.

Если в триггере на вставку/измение то длину можно узнать примерно так:
char_length(trim(charfield))
хотя может правильнее так: char_length(trim(cast(charfield as varchar(6))))

konstb
Сообщения: 14
Зарегистрирован: 02 ноя 2004, 12:12

Re: Дополнение нулями до нужного количества символов

Сообщение konstb » 04 янв 2007, 00:41

Solo писал(а):Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Ну, способ дурацкий, но уж точно сработает (FKEY_WIDTH = входной параметр, до какой длины дополнять):

Код: Выделить всё

      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;

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Сообщение Solo » 04 янв 2007, 11:35

mdfv писал(а):Можно было бы и поконкретней спросить.
Если "перед постингом" имеется ввиду метод dataset.Post в клиентской программе, то проблем наверное нет.

Если в триггере на вставку/измение то длину можно узнать примерно так:
char_length(trim(charfield))
хотя может правильнее так: char_length(trim(cast(charfield as varchar(6))))
Да, конечно в триггере, поэтому я и написал в эту ветку "Проектирование БД и запросов"... Кроме того, не CHAR, конечно, а VARCHAR. Это я переношу базу с MySQL
Спасибо за ответы, обяз. воспользуюсь.

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Re: Дополнение нулями до нужного количества символов

Сообщение mdfv » 04 янв 2007, 13:26

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;
   

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 04 янв 2007, 13:38

Вот еще можно как извратиться:

Код: Выделить всё

s1='000000000';
s2=trim(charfield);
flen=char_length(s2) ;
charfield=substring(s1 from 1 for (6-flen))||s2;

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 04 янв 2007, 14:27

Ну вот что в итоге получилось, проверялось на ФБ 2.0.

Код: Выделить всё

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;

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Re: Дополнение нулями до нужного количества символов

Сообщение Solo » 04 янв 2007, 14:37

Ура, что-то вышло. На основании ваших примеров получился вот такой триггер:

Код: Выделить всё

AS
begin
  while ( char_length(trim(new.ncont)) < 4) do /*ну, или меньше 6-ти*/
  begin
    new.ncont = '0'||new.ncont;
  end
end
То-есть, количество предваряющих нулей верстается в цикле.
Кажется, чар_лейт действует только в FireBirde 2.0 :roll:

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 09 янв 2007, 07:44

Кажется, чар_лейт действует только в FireBirde 2.0
Зато в любой версии действует LIKE:

Код: Выделить всё

while (not new.ncont like '_______%') do

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Сообщение Solo » 09 янв 2007, 09:04

Dimitry Sibiryakov писал(а):
Кажется, чар_лейт действует только в FireBirde 2.0
Зато в любой версии действует LIKE:

Код: Выделить всё

while (not new.ncont like '_______%') do
Не понял... а что, в лайке можно маску задать, что ли? Имеется в виду, если количество знаков меньше 4-х...

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 09 янв 2007, 09:51

По-моему лайк только из-за масок и держат. Иначе на кой он нужен?.. :?

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Сообщение Solo » 21 фев 2007, 12:22

Dimitry Sibiryakov писал(а):По-моему лайк только из-за масок и держат. Иначе на кой он нужен?.. :?
Стыдно признаться, но я думал, что лайк - чтобы по части слова условие задать... Ну, типа "%ров"
...
Петров
Сидоров
...
И как же в нем маску можно задать?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 21 фев 2007, 12:56

Solo писал(а):И как же в нем маску можно задать?
Двумя подставными символами: '_' и '%'. Первый подменяет один любой символ, второй - любое число любых символов.

EvilsInterrupt
Сообщения: 66
Зарегистрирован: 29 авг 2006, 10:00

Сообщение EvilsInterrupt » 23 фев 2007, 10:49

2 Dimitry Sibiryakov:
Не мог ли бы ты показать самый хитрый трюк с этим оператором LIKE, который когда-либо видел или применял?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 23 фев 2007, 15:54

чти доку. Embedded SQL Guide, Using Like.

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Сообщение Solo » 24 фев 2007, 13:54

EvilsInterrupt писал(а):2 Dimitry Sibiryakov:
Не мог ли бы ты показать самый хитрый трюк с этим оператором LIKE, который когда-либо видел или применял?
Тока что попробовал. правда на МуSQL. Работает

Ответить