将值从一列拆分到另一列 SQL DEVELOPER

Split values from a column to another column SQL DEVELOPER

大家好,又来了一个 oracle SQL 问题。

我在将值从一列拆分到另一列时遇到一些问题。

就是这样..我有这个查询:

SELECT MONEDA , 
LISTAGG (MONTO , ';') WITHIN GROUP (ORDER BY MONTO) MONTO,
REGEXP_SUBSTR(MONTO, '[^;]+', 1, 1) col_one,
REGEXP_SUBSTR(MONTO, '[^;]+', 1, 2) col_two  
FROM (SELECT SUM(ZMT.AMOUNT) AS MONTO,
       ZMT.T_TYPE AS tipo,
       JSON_VALUE(MSG, '$.glAccount.currency.code') AS moneda
            FROM Z_MAMBU_TRANSACTIONS ZMT JOIN POSTING_ONLINE0182 PO ON PO.RESP_REFERENCE0182 = ZMT.TRANSACTIONID
            WHERE TO_CHAR(ZMT.CREATIONDATE, 'YYYY-MM-DD') = '2021-04-20' AND
                  PO.POSTING_RESPCODE0182 = 0 AND
                  (JSON_VALUE(MSG, '$.type') = 'DEBIT') OR (JSON_VALUE(MSG, '$.type') = 'CREDIT')
            GROUP BY T_TYPE, JSON_VALUE(MSG, '$.glAccount.currency.code')
            ORDER BY T_TYPE)
GROUP BY MONEDA

结果是下一个:

https://i.stack.imgur.com/QMgYr.png

我需要做的是将“MONTO”值与“;”分开作为其他 2 列(col_one 和 col_two)的分隔符。正如您在结果中看到的那样,他只拆分了第二个值而不是第一个值。

之后我需要从我拆分的值中减去。

这是我需要的例子:

MONEDA  MONTO                             COL_ONE            COL_TWOV
COL     174579148065,39;175491229711,9    174579148065,39    175491229711,9  
DOL     30300300300;30300300300           30300300300        30300300300

谢谢你们!

我在这里只使用基本字符串函数,完全避免使用正则表达式。根据问题最后给出的示例数据:

SELECT
    MONEDA,
    MONTO,
    SUBSTR(MONTO, 1, INSTR(MONTO, ';') - 1) AS COL_ONE,
    SUBSTR(MONTO, INSTR(MONTO, ';') + 1, LENGTH(MONTO) - INSTR(MONTO, ';')) AS COL_TWO
FROM yourTable;

Demo

我同意蒂姆的观点 - substr + instr 做得很好。如果您出于某种原因想要尝试正则表达式,看看这是否有帮助(第 1 - 4 行中的示例数据;查询从第 5 行开始):

SQL> with result (moneda, monto) as
  2    (select 'COL', '174579148065,39;175491229711,9' from dual union all
  3     select 'DOL', '30300300300;30300300300'        from dual
  4    )
  5  select moneda,
  6         regexp_substr(monto, '\d+(,\d+)?', 1, 1) col_one,
  7         regexp_substr(monto, '\d+(,\d+)?', 1, 2) col_two
  8  from result;

MONEDA     COL_ONE              COL_TWO
---------- -------------------- --------------------
COL        174579148065,39      175491229711,9
DOL        30300300300          30300300300

SQL>