【问题标题】:Oracle regular expression substring to add particular number in given stringOracle正则表达式子字符串在给定字符串中添加特定数字
【发布时间】:2017-03-10 20:15:20
【问题描述】:

Oracle 正则表达式substring 在给定字符串中添加特定数字

8030/N/25.00,8017/N/25.00,8089/N/50.00

我有上面的字符串,我需要从上面的字符串中添加8030+8017+8089

如何在 oracle SQL 或 pl/SQL 中解决。

【问题讨论】:

  • 字段的格式是否总是相同的'8030/N/25.00,8017/N/25.00,8089/N/50.00'
  • 你有没有尝试过?

标签: sql oracle


【解决方案1】:

结合使用数学SUBSTRINSTRREVERSE 来实现这一目标。

文字字符串:

SELECT SUBSTR('8030/N/25.00,8017/N/25.00,8089/N/50.00',1,4) AS a,
SUBSTR(substr('8030/N/25.00,8017/N/25.00,8089/N/50.00', - instr(reverse('8030/N/25.00,8017/N/25.00,8089/N/50.00'), '/N/',1,2) - 6),1,4) AS b,
SUBSTR(substr('8030/N/25.00,8017/N/25.00,8089/N/50.00', - instr(reverse('8030/N/25.00,8017/N/25.00,8089/N/50.00'), '/N/',1,3) - 6),1,4) AS c,
(SUBSTR('8030/N/25.00,8017/N/25.00,8089/N/50.00',1,4) +
SUBSTR(substr('8030/N/25.00,8017/N/25.00,8089/N/50.00', - instr(reverse('8030/N/25.00,8017/N/25.00,8089/N/50.00'), '/N/',1,2) - 6),1,4) +
SUBSTR(substr('8030/N/25.00,8017/N/25.00,8089/N/50.00', - instr(reverse('8030/N/25.00,8017/N/25.00,8089/N/50.00'), '/N/',1,3) - 6),1,4)) AS total
FROM dual

使用字段名:

SELECT SUBSTR(YOURFIELD,1,4) AS a,
SUBSTR(substr(YOURFIELD, - instr(reverse(YOURFIELD), '/N/',1,2) - 6),1,4) AS b,
SUBSTR(substr(YOURFIELD, - instr(reverse(YOURFIELD), '/N/',1,3) - 6),1,4) AS c,
(SUBSTR(YOURFIELD,1,4) +
SUBSTR(substr(YOURFIELD, - instr(reverse(YOURFIELD), '/N/',1,2) - 6),1,4) +
SUBSTR(substr(YOURFIELD, - instr(reverse(YOURFIELD), '/N/',1,3) - 6),1,4)) AS total
FROM YOURTABLE

只是总数:

SELECT (SUBSTR(YOURFIELD,1,4) +
SUBSTR(substr(YOURFIELD, - instr(reverse(YOURFIELD), '/N/',1,2) - 6),1,4) +
SUBSTR(substr(YOURFIELD, - instr(reverse(YOURFIELD), '/N/',1,3) - 6),1,4)) AS total
FROM YOURTABLE

【讨论】:

    【解决方案2】:

    您的起始字符串似乎包含一个逗号分隔的值列表,其中每个值由以'/' 分隔的 3 个信息组成。

    如果是这样,一种方法可以是首先识别所有项目,然后“解析”它们以提取所需的信息并对结果求和。

    假设你有一张这样的桌子:

    create table test(id, str) as (
        select 1, '8030/N/25.00,8017/N/25.00,8089/N/50.00' from dual union all
        select 2, '8029/N/25.00,8000/N/25.00,1000/N/50.00' from dual
    )
    

    您可以使用常用的拆分字符串技术提取每一行的项目:

    SELECT id, regexp_substr(str, '[^,]+', 1, level) as item
      FROM test t
    CONNECT BY instr(str, ',', 1, level - 1) > 0
      and prior id = id
      and prior sys_guid() is not null
    

    给予:

            ID ITEM
    ---------- ----------------
             1 8030/N/25.00
             1 8017/N/25.00
             1 8089/N/50.00
             2 8029/N/25.00
             2 8000/N/25.00
             2 1000/N/50.00
    

    现在您必须提取所需的信息(我假设它总是正好在前 4 个字符中)并求和:

    SELECT id, sum(to_char(substr(regexp_substr(str, '[^,]+', 1, level), 1, 4))) as the_sum
      FROM test t
    CONNECT BY instr(str, ',', 1, level - 1) > 0
      and prior id = id
      and prior sys_guid() is not null   
    group by id 
    
            ID    THE_SUM
    ---------- ----------
             1      24136
             2      17029
    

    如果要求和的信息不完全在前 4 个字符中,您只需根据字符串的结构,用一些 REGEXP_SUBSTR 或您需要的任何内容编辑 SUBSTR

    【讨论】:

      【解决方案3】:

      Oracle 设置

      CREATE TABLE table_name ( value ) As
        SELECT '8030/N/25.00,8017/N/25.00,8089/N/50.00' FROM DUAL;
      

      查询

      SELECT TO_NUMBER( REGEXP_SUBSTR( value, '(^|,)(\d+)', 1, 1, NULL, 2 ) )
             + TO_NUMBER( REGEXP_SUBSTR( value, '(^|,)(\d+)', 1, 2, NULL, 2 ) )
             + TO_NUMBER( REGEXP_SUBSTR( value, '(^|,)(\d+)', 1, 3, NULL, 2 ) )
               AS total
      FROM   table_name;
      

      输出

      TOTAL
      -----
      24136
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 2021-09-06
        • 2022-08-21
        • 2023-02-04
        • 1970-01-01
        相关资源
        最近更新 更多