需要帮助在oracle中包含特殊字符和数字的列中仅求和数字吗

需要帮助在oracle中包含特殊字符和数字的列中仅求和数字吗,oracle,oracle11g,oracle11gr2,Oracle,Oracle11g,Oracle11gr2,在oracle assistant上运行此操作时,我收到一个无效的数字错误代码 我正在使用Oracle 11.2.0.3.0Regexp\u like可以帮助您确定哪些文本值是有效的数字;大概是这样的: Name Text a 0 b 1 c 3 d 8 e ! f " g a h h i 9 Select name, Sum(Text) from (select name, to_number(Text

在oracle assistant上运行此操作时,我收到一个无效的数字错误代码


我正在使用Oracle 11.2.0.3.0

Regexp\u like
可以帮助您确定哪些文本值是有效的数字;大概是这样的:

Name Text
a      0
b      1
c      3
d      8
e      !
f      "
g      a
h      h
i      9

Select name, Sum(Text)
from
(select name, to_number(Text) Text
from Table_Name)

group by name

什么版本的Oracle?在12.2或更高版本中,您可以

SQL> with test (name, text) as
  2    (select 'a', '0' from dual union all
  3     select 'b', '1' from dual union all
  4     select 'c', '3' from dual union all
  5     select 'd', '8' from dual union all
  6     select 'g', 'a' from dual union all
  7     select 'i', '9' from dual
  8    )
  9  select sum(text)
 10  from test
 11  where regexp_like(text, '^\d+$');

 SUM(TEXT)
----------
        21

SQL>
在早期版本中,我通常更喜欢

select name, sum( to_number( text default 0 on conversion error ))
  from your_table
 group by name;

基于正则表达式的查找数字的解决方案可以工作,但它们往往很快变得复杂。“1.00”可能是一个数字(假设小数点分隔符是句点),“1.00.00”不是,“-100”是一个数字,“1-00”不是,等等。您通常可以使用正则表达式一段时间,以便它可以处理您拥有的任何数据,但很难确信您已经涵盖了所有情况。如果您决定以不同的方式处理特殊情况(即,您有印度用户输入100000作为100000),那么您可以在放弃转换之前更新函数,以迭代一系列格式掩码。

您的文本列中可能有哪些类型的数字?它们可能是负面的吗?正数前面可以加+(加号)吗?数字周围是否有空格?在这种情况下,是否要忽略它们?数字是否可以是小数,例如3.5如果是,小数点分隔符是什么?数字看起来像32000吗?代表“三万二千”?这假设文本数字(实际数字)只能是非负整数,它们不能像1200(例如,对于一千二百),以逗号作为组分隔符。也许答案就足够了,但也许不行。是的,mathguy。这个例子是以样本数据为基础的。但我希望在现实生活中,开发人员不要仅仅假设业务用户提供给他们的示例数据就是“全部”。在我看来,像我在OP问题下作为评论发布的问题一样提问是一种重要的最佳实践。在我看来,简单地说“我以提问的方式回答了问题”并不是最好的做法。你所说的一切(这里和那里)都是正确的,@mathguy。虽然,这不是真实的生活,这是一个提出问题,我们回答它的OP:)我不记得我曾经见过上面贴的桌子,也无法想象它的用途。也许这是一个简单的家庭作业。也许这是一个过于简单化的问题。大概谁知道呢?我们知道别人告诉我们什么。我使用的是4.0.3.16版。我试着运行这个查询,它说我找不到正确的答案parenthesis@Deno-Oracle没有4.0.3.16版。1998年我毕业时,Oracle的版本是8.1.5。
select*fromv$version
返回什么?两个版本中哪一个抛出错误?我在最初的查询中确实有语法错误,刚刚修复-很抱歉,版本是11g…11.2.0.3。0@Deno-好的。那么转换错误时的
默认值0
方法不是一个选项。
safe\u to\u number
方法对您有效吗?
create or replace function safe_to_number( p_str in varchar2 )
  return number
is
  l_ret number;
begin
  l_ret := to_number( p_str );
  return l_ret;
exception
  when others then
    return null;
end;

select name, safe_to_number( text )
  from your_table
 group by name