Расширенный SQL - на основе значения в таблице, я хочу сделать расчет - PullRequest
0 голосов
/ 09 июня 2018

Вот ситуация, например, посмотрите на содержимое ниже в таблице

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;

Я хочу суммировать все значения, где столбец near_number является целым числом.В этом случае я хочу суммировать 10, 20, 60. Другие строки не рассматриваются, так как они не содержат только целые значения (т. Е. Содержат символы, отличные от 0 до 9)

Желаемый результат:

   SUM_INT
----------
        90

Ответы [ 4 ]

0 голосов
/ 09 июня 2018

(Требуется 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;
0 голосов
/ 09 июня 2018

Используйте REGEXP_LIKE(), чтобы проверить, состоит ли NEARLY_NUMBER только из цифр от начала до конца, используя класс [:digit:] POSIX для фильтрации строк из CAST_EX, а затем используйте TO_NUMBER() и SUM().

SELECT SUM(TO_NUMBER(NEARLY_NUMBER))
       FROM CAST_EX
       WHERE REGEXP_LIKE(NEARLY_NUMBER, '^[[:digit:]]+$');
0 голосов
/ 09 июня 2018

Вам нужно просто взять те строки, которые удовлетворяют предложению целых чисел
1) Translate & Replace удалит все вещи, кроме целых
2) Если то, что остается NULL, то исходная строка должна быть целым числом
3) Преобразуйте это в число и получите СУММУ.

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'
0 голосов
/ 09 июня 2018

По вашему вопросу ваш ответ следующий:

select sum(cast(VALUE AS INTEGER)) from example where ISNUMERIC(value) = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...