Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Отсечение цифр от букв.....  [new]
n@vigator
Member

Откуда: Москва
Сообщений: 173
Есть строка следующего вида nnn...nAAAA......, где n-цифры, а А-буквы.
Есть ли какие-нибудь стандартные функции, которые помогут отбросить буквы и оставить одни цифры, т.е. получить строку вида nnnn...n???
13 апр 05, 10:42    [1463402]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
McMurfy
Member

Откуда: Киев
Сообщений: 474
Translate
13 апр 05, 10:49    [1463458]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3456
n@vigator
Есть строка следующего вида nnn...nAAAA......, где n-цифры, а А-буквы.
Есть ли какие-нибудь стандартные функции, которые помогут отбросить буквы и оставить одни цифры, т.е. получить строку вида nnnn...n???
Примерно вот так:
select str,
       translate(str,'1234567890'||
                     replace( -- Удалим из исходной строки цифру 0
                      replace( -- Удалим из исходной строки цифру 9
                       replace( -- Удалим из исходной строки цифру 8
                        replace( -- Удалим из исходной строки цифру 7
                         replace( -- Удалим из исходной строки цифру 6
                          replace( -- Удалим из исходной строки цифру 5
                           replace( -- Удалим из исходной строки цифру 4
                            replace( -- Удалим из исходной строки цифру 3
                             replace( -- Удалим из исходной строки цифру 2
                              replace( -- Удалим из исходной строки цифру 1
                                       str
                                       ,'1'
                                     ),'2'
                                    ),'3'
                                   ),'4'
                                  ),'5'
                                 ),'6'
                                ),'7'
                               ),'8'
                              ),'9'
                             ),'0'
                            ),
                     '1234567890'
                ) str_without_char
  from (
          select '12kjjh1438734jbvjh389u34jnvfe28fvu5894' str 
            from dual
       )

Там STR - исходная строка.
13 апр 05, 11:07    [1463579]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
db-man
Guest
SQL> select translate('12kjjh1438734jbvjh389u34jnvfe28fvu5894', 'x1234567890', 'x') x from dual;

X
------------------
kjjhjbvjhujnvfefvu
13 апр 05, 11:16    [1463640]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3456
db-man
SQL> select translate('12kjjh1438734jbvjh389u34jnvfe28fvu5894', 'x1234567890', 'x') x from dual;

X
------------------
kjjhjbvjhujnvfefvu
Будь по твоему:
select str,
       translate(str,'1234567890'||
                     translate('x'||str,'x1234567890','x'),
                     '1234567890'
                ) str_without_char
  from (
          select '12kjjh1438734jbvjh389u34jnvfe28fvu5894' str 
            from dual
       );

                  STR                             STR_WITHOUT_CHAR            
-------------------------------------- -------------------------------------- 
12kjjh1438734jbvjh389u34jnvfe28fvu5894 12143873438934285894                   

1 row(s) retrieved
13 апр 05, 11:23    [1463686]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29114
2 Владимор Конев
Тогда уж лучше так:
select str, translate(str, '0' || translate(str, '_1234567890', '_'), '0') as str_without_char ...
13 апр 05, 11:25    [1463696]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3456
Elic
2 Владимор Конев
Тогда уж лучше так:
select str, translate(str, '0' || translate(str, '_1234567890', '_'), '0') as str_without_char ...
Ну, и так тож можно... :-)
13 апр 05, 11:31    [1463735]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6481
Я свою функцию использую:

   CREATE OR REPLACE FUNCTION GetOnlyNumbers(VAL in varchar2)
   RETURN VARCHAR2 IS
      Result varchar2(100);
      i      integer;
      c      char(1);
   BEGIN
      Result:='';

      if not (VAL is NULL) then
         for i in 1..length(VAL) loop
            c:=substr(VAL,i,1);
            if (c>='0') and (c<='9') then Result:=Result||c;  end if;
         end loop;
      end if;

      return(Result);
   END;

Не думаю, что она медленнее TRANSLATE...
13 апр 05, 14:28    [1464714]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
micp
Guest
одна запара - больше ста символов не вернет. и выругается по ораклинному, что для юзера не покатит.
13 апр 05, 14:36    [1464751]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
acrobat
Member

Откуда:
Сообщений: 283
2 Кроик Семён
Ваша функция на 1 мил. записей отработала в 50 раз медл.
19 май 05, 18:38    [1556843]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57975
Блог
Кроик Семён
Не думаю, что она медленнее TRANSLATE...

Лично я - удивлюсь, если она окажется "не медленнее". Соревноваться в скорости со встроенными функциями - примерно то же, что соревноваться в поднятии тяжестей с башенным краном. Шансы есть только если оппонент очень плохо поработал.
19 май 05, 18:41    [1556850]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
Stax.
Guest
softwarer
Кроик Семён
Не думаю, что она медленнее TRANSLATE...

Лично я - удивлюсь, если она окажется "не медленнее". Соревноваться в скорости со встроенными функциями - примерно то же, что соревноваться в поднятии тяжестей с башенным краном. Шансы есть только если оппонент очень плохо поработал.


Ведел тесты одного форумчанина,
кажись на replace,
так у него быстрее было для старых версий
19 май 05, 21:24    [1557065]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57975
Блог
Stax.
softwarer

..... Шансы есть только если оппонент очень плохо поработал.


..... быстрее было для старых версий

20 май 05, 11:43    [1558245]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
Hill
Guest
select TRANSLATE('a45TEX434T','0123456789'||TRANSLATE('a45TEX434T', '0123456789', 'XXXXXXXXXX'), '0123456789') as TTT from dual;

Результат:
45434
17 апр 06, 16:51    [2571748]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
Tolmachov Dmitiry
Member

Откуда: Москва, Пенза
Сообщений: 1520
По-моему, тему пора в FAQ. Решение для 10-ки
SELECT regexp_replace('32#56*32+00abc;', '[^[:digit:]]') FROM dual
17 апр 06, 17:07    [2571859]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
pesOK
Member

Откуда:
Сообщений: 26
а в документации написан один примерчик для translate
The following statement returns a license number with the characters removed and the digits remaining:

SELECT TRANSLATE('2KRW229',
   '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789') 
   "Translate example"
     FROM DUAL;
 
Translate example
-----------------
2229

помогает при версиях ниже 10 ;)
2 июн 06, 11:21    [2733566]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15448
pesOK
а в документации написан один примерчик для translate
The following statement returns a license number with the characters removed and the digits remaining:

SELECT TRANSLATE('2KRW229',
   '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789') 
   "Translate example"
     FROM DUAL;
 
Translate example
-----------------
2229

помогает при версиях ниже 10 ;)


Как всегда - страшнее кошки (a-z в апперкейсе) зверя нет.
select translate(s,'1'||translate(s,'~0123456789','~'),'1')
from (select 'asdfgh345fgh56fg67' s from dual)
2 июн 06, 11:29    [2733601]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29114
orawish
Как всегда - страшнее кошки (a-z в апперкейсе) зверя нет.
select translate(s,'1'||translate(s,'~0123456789','~'),'1')
from (select 'asdfgh345fgh56fg67' s from dual)
Что, древнего слоника прямо здесь же ты не заметил ? :)
2 июн 06, 11:37    [2733656]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15448
Elic
orawish
Как всегда - страшнее кошки (a-z в апперкейсе) зверя нет.
select translate(s,'1'||translate(s,'~0123456789','~'),'1')
from (select 'asdfgh345fgh56fg67' s from dual)
Что, древнего слоника прямо здесь же ты не заметил ? :)

Ой, блин.. и правда.. байт в байт
2 июн 06, 11:42    [2733695]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Отсечение цифр от букв.....  [new]
daunito
Member

Откуда:
Сообщений: 645
Не хочу создавать новую ветку, потому что проблема один в один. Когда увидел код топикстартера, то понял, что отличается он только именами переменных. Написал такую же функцию для тех же целей. И сразу меня засмущала скорость работы. Было непреодолимое желание сделать все это translate'ом, только проблема в следующем. Надо знать символы, которые должны заменяться, а у меня в строке помимо букв есть еще и всякие символы (половина из которых даже не отображается). Вообщем много мусора, который я проверить никак не смогу. Ждать когда запрос что-то пропустит нельзя, должно работать железно. Из строки надо вытащить только цифры в порядке очередности. Кто что может подсказать? Или это нереализуемо стандартным функционалом?
10 июл 10, 00:44    [9082121]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9529
daunito
Надо знать символы, которые должны заменяться, а у меня в строке помимо букв есть еще и всякие символы (половина из которых даже не отображается).


Then you did not understand "древнего слоника". We have string str where помимо букв and digits есть еще и всякие символы (половина из которых даже не отображается). Terminolory: second parameter is "from" third parameter is "to". Then

translate(str,'_0123456789','_')

replaces translates _ to _ and since digits are not in "to" parameter they will be removed from str leaving буквы и всякие символы. Now:

translate(str,'0' || translate(str,'_0123456789','_'),'0')

Now "from" parameter is zero followed by all non-digit characters present in str while "to" parameter is just zero. So zero will be translated to zero and all non-digit characters present in str will be removed. As a result, we will get just digits present in str. This is a "beauty" "древнего слоника".

SY.
10 июл 10, 04:24    [9082208]     Ответить | Цитировать Сообщить модератору
 Re: Отсечение цифр от букв.....  [new]
daunito
Member

Откуда:
Сообщений: 645
SY, thank you.
11 июл 10, 01:36    [9083489]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить