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

Sql 如何将负数和逗号分隔的值转换为oracle数字?,sql,oracle,Sql,Oracle,我有这样的价值观- 43042 -1 44889 35224 -1000 17683 数据类型显然是varchar 2 我必须在列中输入一个条件以选择5000以上的值,但由于存在逗号和负号,我无法将其转换为数字。 如何将其转换为数字以执行此检查 提前谢谢。试试这个 试试这个 您可以使用合适的将字符串转换为数字: to_number(your_string, '999,999,999') 使用适当数量的组和组分隔符。我假设,如果要查找5000以上的值,逗号表示字符串中的组分隔符,而不是十进制分隔

我有这样的价值观-

43042
-1
44889
35224
-1000
17683

数据类型显然是varchar 2

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

提前谢谢。

试试这个 试试这个 您可以使用合适的将字符串转换为数字:

to_number(your_string, '999,999,999')
使用适当数量的组和组分隔符。我假设,如果要查找5000以上的值,逗号表示字符串中的组分隔符,而不是十进制分隔符。更安全的做法是,避免依赖会话NLS设置,更明确地说明:

to_number(replace(your_string, ' '), '999G999G999', 'NLS_NUMERIC_CHARACTERS=''.,''')
示例数据中稍微复杂的一点是字符串中也存在空格。您可以使用以下选项将其去除:

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
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;
使用来自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
或者更安全地说:

where to_number(replace(your_string, ' '), '999G999G999', 'NLS_NUMERIC_CHARACTERS=''.,''')
  > 5000
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错误。。。即使是没有组分隔符的数字,或者它们位于错误的位置,如果您声明它们应该位于某些位置,也会出错。

您可以使用合适的方法将字符串转换为数字:

to_number(your_string, '999,999,999')
使用适当数量的组和组分隔符。我假设,如果要查找5000以上的值,逗号表示字符串中的组分隔符,而不是十进制分隔符。更安全的做法是,避免依赖会话NLS设置,更明确地说明:

to_number(replace(your_string, ' '), '999G999G999', 'NLS_NUMERIC_CHARACTERS=''.,''')
示例数据中稍微复杂的一点是字符串中也存在空格。您可以使用以下选项将其去除:

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
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;
使用来自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
或者更安全地说:

where to_number(replace(your_string, ' '), '999G999G999', 'NLS_NUMERIC_CHARACTERS=''.,''')
  > 5000
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错误。。。即使是一个没有分组分隔符的数字,或者是在错误的位置,如果您声明它们应该在某些位置,也会出错。

您的数字格式是什么?逗号或冒号逗号是组分隔符还是十进制分隔符?i、 e.第一个值应该代表43042(43000和一位)还是43.042(43和一位)?(你为什么要把数字存储为字符串呢?)我不是,它已经被表的创建者预先定义好了,我现在不能更改它。你还没有说逗号应该代表什么。以及列中的所有值是否都与该模式匹配-它们都是“数字”,表示正整数和负整数,并且在预期的位置都有组分隔符(如果是)逗号。如果问题比您建议的更复杂,请编辑您的问题,以提供更具代表性的数据。您还可以包括
select value from nls\u session\u parameters的输出,其中parameter='nls\u NUMERIC\u CHARACTERS'
以获取信息。您的数字格式是什么?逗号或冒号逗号是组分隔符还是十进制分隔符?i、 e.第一个值应该代表43042(43000和一位)还是43.042(43和一位)?(你为什么要把数字存储为字符串呢?)我不是,它已经被表的创建者预先定义好了,我现在不能更改它。你还没有说逗号应该代表什么。以及列中的所有值是否都与该模式匹配-它们都是“数字”,表示正整数和负整数,并且在预期的位置都有组分隔符(如果是)逗号。如果问题比您建议的更复杂,请编辑您的问题,以提供更具代表性的数据。您还可以包含nls_session_参数中的
选择值的输出,其中参数='nls_NUMERIC_CHARACTERS'
以获取信息。显然,减号和第一个数字之间有一个空格,您也应该删除它。您假设逗号应该是十进制分隔符-这可能是正确的,不清楚-您正在将它们转换为句点,以便使用默认格式模型?但如果是这种情况,使用显式格式模型并指定NLS_数字_字符可能更好。显然,减号和第一个数字之间有一个空格,您也应该删除它。您假设逗号应该是十进制分隔符-这可能是正确的,不清楚-您正在将它们转换为句点,以便使用默认格式模型?但如果是这种情况,使用显式格式模型并指定NLS_数字_字符可能会更好。它已经存在了,我现在无能为力,而且该方法无法工作,因为它给出了无效的数字…@SiddharthBhatia-那么您的值与该模式不匹配。它适用于您给出的示例。您可以删除逗号,但也有小数吗?对字符串的操作越多,就越不确定结果是否符合预期。当我从列中选择数据时,它会起作用,但当我将它与where一起使用时,它不会起作用,并将它用作条件@Alex Pooles当你从列中选择每个值时,或者当你在SQL Developer的查询结果窗口中获取第一个值时,比如说,50时,它真的起作用吗?稍后在结果集中可能会有一个不可转换的字符串。或者另一个过滤条件