CREATE OR REPLACE function to_numeric(v in varchar2)
return number as
num number;
begin
num := to_number(v);
return num;
exception
when others then
return null;
end;
/
where to_number(replace(your_string, ' '), '999,999,999') > 5000
型 或者更安全:
where to_number(replace(your_string, ' '), '999G999G999', 'NLS_NUMERIC_CHARACTERS=''.,''')
> 5000
型 使用来自CTE的字符串进行演示:
with t (n) as (
select '43,042 ' from dual
union all select '- 1' from dual
union all select '44,889' from dual
union all select '35,224' from dual
union all select '- 1,000' from dual
union all select '17,683' from dual
)
select n, to_number(replace(n, ' '), '999,999,999') as converted
from t
where to_number(replace(n, ' '), '999,999,999') > 5000;
N CONVERTED
------- ----------
43,042 43042
44,889 44889
35,224 35224
17,683 17683
型 或者更安全:
with t (n) as (
select '43,042 ' from dual
union all select '- 1' from dual
union all select '44,889' from dual
union all select '35,224' from dual
union all select '- 1,000' from dual
union all select '17,683' from dual
)
select n, to_number(replace(n, ' '), '999G999G999', 'NLS_NUMERIC_CHARACTERS=''.,''')
as converted
from t
where to_number(replace(n, ' '), '999G999G999', 'NLS_NUMERIC_CHARACTERS=''.,''') > 5000;
3条答案
按热度按时间pdtvr36n1#
试试这个
字符串
jv2fixgn2#
字符串
4uqofj5v3#
您可以使用
to_number()
和合适的格式模型将字符串转换为数字:字符串
具有适当数量的组和组分隔符。假设您正在查找大于5000的值,逗号表示字符串中的组分隔符,而不是十进制分隔符。更安全的做法是,避免依赖于您的会话NLS设置,更明确地说明它:
型
示例数据中的一个小问题是字符串中也存在空格。您可以使用
replace()
来剥离这些:型
所以你的情况可能是:
型
或者更安全:
型
使用来自CTE的字符串进行演示:
型
或者更安全:
型
当然,您不应该首先将数字存储为字符串。使用正确的数据类型,您就不必处理这类问题。您也不必担心字符串不是您期望的格式,因此可能会因多种原因导致ORA-01722错误。即使一个数字没有组分隔符,或者把它们放在错误的地方,如果你声明它们应该在某些地方,也会出错。