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
Для того чтобы разбить строку на подстроки, используя разделитель «;», можно воспользоваться следующим запросом.
Разделитель, конечно, может быть разный.
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.
Другие примеры…
Читать дальше про “Извлечь подстроки используя разделители” »
Запрос для вывода только числовых значений, используем 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
Последние комментарии