0

这是一种情况,例如看一下表格中的以下内容

create table cast_ex(nearly_number varchar2(20));

insert into cast_ex values('10');
insert into cast_ex values('20');
insert into cast_ex values('thirty');
insert into cast_ex values('FORTY');
insert into cast_ex values('Fifty[50])');
insert into cast_ex values('60');

commit;

我想对列 Nearly_number 完全为整数的所有值求和。在这种情况下,我想对 10 、 20 、 60 求和。不考虑其他行,因为它们不只包含整数值(即,它们包含 0 到 9 之间以外的字符)

期望的输出:

   SUM_INT
----------
        90
4

3 回答 3

1

用于REGEXP_LIKE()检查是否NEARLY_NUMBER仅包含从头到尾的数字,使用[:digit:]POSIX 类过滤行CAST_EX,然后使用TO_NUMBER()and SUM()

SELECT SUM(TO_NUMBER(NEARLY_NUMBER))
       FROM CAST_EX
       WHERE REGEXP_LIKE(NEARLY_NUMBER, '^[[:digit:]]+$');
于 2018-06-09T04:37:00.903 回答
1

您只需要获取满足整数子句的那些行
1)翻译和替换将删除除整数以外的所有内容
2)如果剩下的是 NULL,则原始字符串必须是整数
3)将其转换为数字并获取 SUM。

SELECT SUM(TO_NUMBER(nearly_number)) AS SUM_INT
  FROM cast_ex
 WHERE (CASE
         WHEN REPLACE(TRANSLATE(nearly_number, '0123456789', '##########'),
                      '#',
                      '') IS NULL THEN
          'TRUE'
         ELSE
          'FALSE'
       END) = 'TRUE'
于 2018-06-09T06:04:37.227 回答
1

(需要 Oracle 12.2 或更高版本:)

select sum(to_number(nearly_number default 0 on conversion error)) as sum_int
from   cast_ex
where  mod(to_number(nearly_number default 0 on conversion error),1) = 0;

或最小化显式转换的次数

select sum(int_value) as sum_int
from   ( select to_number(nearly_number default 0 on conversion error) as int_value
         from   cast_ex )
where  mod(int_value,1) = 0;
于 2018-06-09T09:18:48.250 回答