需要帮助在oracle中包含特殊字符和数字的列中仅求和数字吗
在oracle assistant上运行此操作时,我收到一个无效的数字错误代码需要帮助在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 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