Архив

Публикации с меткой ‘строка’

Замена кратных пробелов на один

17 Март 2010 6 comments
with t as (
  select 1 id, 'a s        sfd' info from dual
   union all
  select 2 id, 'a        b; g;g ;g  f' info from dual
   union all
  select 3 id, 'a     ' info from dual
   union all
  select 4 id, '     ' info from dual
)
SELECT id, REGEXP_REPLACE(TRIM(info), '  *', ' ') AS info_new FROM t
ORDER BY id;

Пример:

        ID INFO_NEW
---------- --------------------------------------------------------------------------------
         1 a s sfd
         2 a b; g;g ;g f
         3 a
         4

Извлечь подстроки используя разделители

17 Март 2010 7 comments

Для того чтобы разбить строку на подстроки, используя разделитель «;», можно воспользоваться следующим запросом.
Разделитель, конечно, может быть разный.

SQL> SELECT regexp_substr(str, '[^;]+', 1, level) str
  2  FROM (
  3        SELECT ' 1; 2; test1.' str FROM dual     ) t
  4  CONNECT BY instr(str, ';', 1, level - 1) > 0
  5  ;

STR
-------------
 1
 2
 test1.

Если хотим разбить на слова используя в виде разделителя пробел, то можно использовать perl синтаксис:

SQL> SELECT regexp_substr(str, '\S+', 1, level) str
  2  FROM (
  3        SELECT ' 1 2 test1.' str FROM dual     ) t
  4  connect by regexp_substr(str,'\S+',1,level) is not null
  5  ;

STR
-----------
1
2
test1.

Другие примеры…

Читать дальше про “Извлечь подстроки используя разделители” »

Узнать является ли строка числом

17 Март 2010 3 comments

Запрос для вывода только числовых значений, используем REGEXP.

При необходимости, оставляем только точку или запятую ‘^-?[[:digit:].]*$‘ или ‘^-?[[:digit:],]*$‘.
Или только целые числа ‘^-?[[:digit:]]*$

with t as (
  select '56456456' str from dual
  union all
  select '4 5' str from dual
  union all
  select 'sds5' str from dual
  union all
  select '-1,5' str from dual  
  union all
  select '-1.5' str from dual  
  )
  select * FROM t 
	where regexp_like(str, '^-?[[:digit:].,]*$');

STR
--------
56456456
-1,5
-1.5

Ну и более простой вариант, который тоже подходит в некоторых случаях:

select case when length(TRIM(TRANSLATE('45', ' 0123456789', ' '))) is null then 'ЧИСЛО'
            else 'СТРОКА'
       end res from dual
union all
select case when length(TRIM(TRANSLATE('a4', ' 0123456789', ' '))) is null then 'ЧИСЛО'
            else 'СТРОКА'
       end res from dual

Вывести строки, которые начинаются на цифру

with t as (
  select '56456456' str from dual
  union all
  select '4 5' str from dual
  union all
  select 'sds5' str from dual
  union all
  select '-1,5' str from dual  
  union all
  select '-1.5' str from dual  
  )
  select * FROM t 
	where regexp_like(str, '^\d');

STR
--------
56456456
4 5