首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高级SQL -基于表中的值,我要进行计算

问高级SQL -基于表中的值,我要进行计算
EN

Stack Overflow用户
提问于 2018-06-09 11:38:48
回答 3查看 63关注 0票数 0

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

代码语言:javascript
复制
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之间的字符)

所需输出:

代码语言:javascript
复制
   SUM_INT
----------
        90
EN

回答 3

Stack Overflow用户

发布于 2018-06-09 12:37:01

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

代码语言:javascript
复制
SELECT SUM(TO_NUMBER(NEARLY_NUMBER))
       FROM CAST_EX
       WHERE REGEXP_LIKE(NEARLY_NUMBER, '^[[:digit:]]+$');
票数 1
EN

Stack Overflow用户

发布于 2018-06-09 14:04:37

您只需要获取那些满足integer子句的行

1)翻译和替换将删除除整数以外的所有内容

2)如果剩余部分为空,则原始字符串必须为整数

3)将其转换为数字并获得SUM。

代码语言:javascript
复制
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'
票数 1
EN

Stack Overflow用户

发布于 2018-06-09 17:18:48

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

代码语言:javascript
复制
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;

或者最小化显式转换的数量。

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50770686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档