【问题标题】:Getting the sum of fields made numeric with regexp_replace使用 regexp_replace 获取数字字段的总和
【发布时间】:2022-01-13 16:15:57
【问题描述】:

在 Oracle 中,我需要从字符串字段中获取数字的总和。这些数字可能包括一个 .. 我尝试了以下查询:

SELECT line_id, SUM(footage)
  FROM (SELECT line_id,
               CASE
                 WHEN footage IS NULL THEN
                  0
                 ELSE
                  TO_NUMBER(REGEXP_REPLACE(footage, '[^0-9.]+', ''))
               END AS footage
          FROM pipe)
 GROUP BY service_line_id

这会在 REGEXP_REPLACE 上给出一个错误,即它是一个无效数字。如果我省略小数点,它会起作用,但我真的需要包括它。如何获得正则表达式中包含小数点的总和?

【问题讨论】:

  • 请包含产生错误的样本数据。您的会话 NLS_NUMERIC_CHARACTERS 设置是什么?您可能只需要在to_number() 调用中使用可选的第三个参数来指定它。但是这些值可能还有其他问题。
  • 您的查询将作为service_line_id 的外部查询组失败,但内部子查询中没有选择service_line_id

标签: sql oracle sum regexp-replace


【解决方案1】:

您的查询可能会留下多个句号字符,这将导致无效数字。您可以尝试使用以下方法匹配小数,而不是尝试替换非数字字符:

REGEXP_SUBSTR(footage, '\d+(\.\d*)?|\.\d+')

然后您可以将查询简化为:

SELECT line_id,
       SUM(COALESCE(TO_NUMBER(REGEXP_SUBSTR(footage, '\d+(\.\d*)?|\.\d+')), 0))
         AS footage
FROM   pipe
GROUP BY line_id

其中,对于样本数据:

CREATE TABLE pipe (line_id, footage) AS
SELECT 1, '42 is an integer.' FROM DUAL UNION ALL
SELECT 1, 'A decimal is like 2.5.' FROM DUAL UNION ALL
SELECT 1, 'Some decimals, like .32 do not have an integer part.' FROM DUAL;

输出:

LINE_ID FOOTAGE
1 44.82

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多