从带有特殊字符的字符串转换为数字
Posted
技术标签:
【中文标题】从带有特殊字符的字符串转换为数字【英文标题】:Converting to number from string with special characters 【发布时间】:2016-01-30 20:07:23 【问题描述】:我有一个包含以下值的输入列。
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|\.]]', '')
谁能建议如何做到这一点?我做错了什么?我正在与 pl/sql 开发人员一起开发 Oracle 11.2 数据库。
【问题讨论】:
只需在模式中使用[^\d.]+
。
这不起作用,它替换了除“.”之外的所有内容。这是我使用的查询 select regexp_replace('%1.aa2', '[^\d.]+', '') from dual
我猜在这种情况下你也必须转义反斜杠。试试\\d
而不是\d
。
【参考方案1】:
使用 POSIX 类来匹配数字字符,即[:digit:]
。所以这个否定类[^[:digit:].]
应该匹配任何字符,但不能匹配点或数字。
regexp_replace('%1.aa2', '[^[:digit:].]', '')
【讨论】:
这与 '[^[\d.]] 有何不同? 不知道oracle是否支持\d
。如果它支持,那么它将是[^\d.]
谢谢@Avinash raj。 [:digit] 工作正常。我确信oracle 也支持'\d'。检查此语句 select regexp_replace('asas12313', '\d', '-') from dual【参考方案2】:
您可以使用[^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 的结果:
【讨论】:
以上是关于从带有特殊字符的字符串转换为数字的主要内容,如果未能解决你的问题,请参考以下文章