我有像 -
这样的价值观 43,042
- 1
44889个
35,224
- 1,000
17683个
,数据类型显然是varchar 2。
我必须在列中添加条件以选择5000以上的值,但由于存在逗号和负号,我无法将其转换为数字。 如何将其转换为数字以执行此检查。
提前致谢。
答案 0 :(得分:1)
您可以使用to_number()
与合适的format model将字符串转换为数字:
to_number(your_string, '999,999,999')
具有适当数量的组和组分隔符。我假设,鉴于您正在寻找5000以上的值,逗号表示字符串中的组分隔符而不是小数分隔符。为了避免依赖于你的会话NLS设置,更明确一点是更安全:
to_number(replace(your_string, ' '), '999G999G999', 'NLS_NUMERIC_CHARACTERS=''.,''')
示例数据中的轻微复杂性也是字符串中存在空格。您可以使用replace()
删除它们:
to_number(replace(your_string, ' '), '999,999,999')
所以你的情况可能是:
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;
当然,您不应该首先将数字存储为字符串。使用正确的数据类型,您不必处理此类问题。您也不必担心字符串不符合您期望的格式,因此可能由于多种原因导致ORA-01722错误...即使是没有组分隔符的数字,或者将它们放在错误的地方,如果你说它们应该在某些地方,就会出错。
答案 1 :(得分:0)
select to_number(replace(your_varchar_column,',','.'))
from your_table
where to_number(replace(your_varchar_column,',','.')) >5000
答案 2 :(得分:0)
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;
/