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

de90aj5v  于 2023-08-04  发布在  Oracle
关注(0)|答案(3)|浏览(136)

我的价值观是-
四万三千零四十二

  • 1
    44,889
    35,224
  • 1,000
    17,683
    数据类型显然是varchar 2。
    我必须在列中放置一个条件来选择5000以上的值,但由于逗号和负号的存在,我无法将其转换为数字。如何将其转换为数字以执行此检查。
    先谢谢你。
pdtvr36n

pdtvr36n1#

试试这个

select to_number(replace(your_varchar_column,',','.')) 
from your_table
where to_number(replace(your_varchar_column,',','.')) >5000

字符串

jv2fixgn

jv2fixgn2#

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

字符串

4uqofj5v

4uqofj5v3#

您可以使用to_number()和合适的格式模型将字符串转换为数字:

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错误。即使一个数字没有组分隔符,或者把它们放在错误的地方,如果你声明它们应该在某些地方,也会出错。

相关问题