2015-10-30 4 views
0

У меня есть столбец ввода со значениями ниже.Преобразование числа из строки со специальными символами

1.2% 
111.00$ 
$100.00 
aa 
ss 

Ожидаемый

1.2 
111.00 
100.00 
null 
null 

Я пытаюсь использовать regexp_replace и попытался заменить каждый символ, который не является цифрой или «» так что 1.2% станет 1.2. Вот запрос, который я пробовал, но это не сработало.

regexp_replace('%1.aa2', '[^[\d|\.]]', '') 

Может кто-нибудь предложить, как это сделать? и что я делаю неправильно? Я работаю над базой данных Oracle 11.2 с разработчиком pl/sql.

+1

Просто используйте '+' в шаблоне. – hjpotter92

+0

это не сработало, оно заменяет все, кроме «.». Вот запрос, который я использовал select regexp_replace ('% 1.aa2', '[^ \ d.] +', '') Из двойного – Nitesh

+0

Я думаю, вам также придется избегать обратной косой черты в этом случае. Попробуйте '\\ d' вместо' \ d'. – hjpotter92

ответ

1

Используйте класс POSIX для соответствия символов цифр, т.е. [:digit:]. Таким образом, этот отрицательный класс [^[:digit:].] должен соответствовать любому символу, но не точке или цифре.

regexp_replace('%1.aa2', '[^[:digit:].]', '') 
+0

Как это отличается от '[^ [\ d.]] ? – Nitesh

+0

не знаю, поддерживает ли oracle '\ d'. Если он поддерживает, то это будет '[^ \ d.]' –

+0

Спасибо @Avinash raj. [: digit] работал нормально. Я уверен, что оракул поддерживает «\ d». Проверьте это заявление выберите regexp_replace ('asas12313', '\ d', '-') из двойного – Nitesh

1

Вы можете использовать [^0-9.] регулярное выражение и заменить пустой строкой:

with testdata(txt) as (
    select 'ss' from dual 
    union 
    select 'aa' from dual 
    union 
    select '$100.00'  from dual 
    union 
    select '111.00$'    from dual 
    union 
    select '1.2%'    from dual 
) 
select regexp_replace(txt, '[^0-9.]', '') 
from testdata; 

результат SQL fiddle: [.^\ D]

enter image description here

Смежные вопросы