如何将负数和逗号分隔值转换为数字oracle?

时间:2017-06-19 08:18:44

标签: sql oracle

我有像 -

这样的价值观

43,042
- 1
44889个
35,224
- 1,000
17683个

,数据类型显然是varchar 2。

我必须在列中添加条件以选择5000以上的值,但由于存在逗号和负号,我无法将其转换为数字。 如何将其转换为数字以执行此检查。

提前致谢。

3 个答案:

答案 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;
/