【问题标题】:Replacing symbols in string - optimization question替换字符串中的符号 - 优化问题
【发布时间】:2020-01-20 20:22:01
【问题描述】:

有一个字符串:

{([ab1]+[ab2])*([bc1]+[bc2])*([cd2]+[cd3])}

还有一个集合(pls_integer index by varchar2(3)):

[ab1] := 1000
[cd3] := 1000
[bc1] := 10000
[cd2] := 10000
[bc2] := 20000
[ab2] := 20000

仅供参考:这个集合是通过SELECT 填充的,所以可以用于下面描述的问题:

我的目标是用这个集合中的数量替换字符串中的符号,并得到:

'(1000+20000)*(10000+20000)*(10000+1000)'

我已经在 PL/SQL 中使用循环完成了这项工作,然后通过正则表达式找到第一次出现的 3 字符符号,替换等。

我的问题:是否可以在一个查询中完成?

样本选择:

SELECT '[ab1]' AS symbol, 1000 AS amt from dual union all
SELECT '[cd3]',1000  from dual union all
SELECT '[bc1]',10000 from dual union all
SELECT '[cd2]',10000 from dual union all
SELECT '[bc2]',20000 from dual union all
SELECT '[ab2]',20000 from dual;

【问题讨论】:

  • 你想要的结果是什么?带有(1000+20000)*(10000+20000)*(10000+1000)的字符串?
  • 是的,对不起,我忘了提,更新问题

标签: sql oracle plsql


【解决方案1】:

使用递归子查询分解子句:

查询

WITH variables ( id, variable, value ) AS (
  SELECT 1, '[ab1]',  1000 FROM DUAL UNION ALL
  SELECT 2, '[cd3]',  1000 FROM DUAL UNION ALL
  SELECT 3, '[bc1]', 10000 FROM DUAL UNION ALL
  SELECT 4, '[cd2]', 10000 FROM DUAL UNION ALL
  SELECT 5, '[bc2]', 20000 FROM DUAL UNION ALL
  SELECT 6, '[ab2]', 20000 FROM DUAL
),
equations ( equation ) AS (
  SELECT '{([ab1]+[ab2])*([bc1]+[bc2])*([cd2]+[cd3])}' FROM DUAL UNION ALL
  SELECT '{([ab2]+[bc1])}' FROM DUAL
),
substitutions ( equation, id, max_id ) AS (
  SELECT REPLACE( equation, variable, value ),
         v.id,
         v.max_id
  FROM   equations e
         INNER JOIN 
         ( SELECT v.*,
                  MAX( id ) OVER () AS max_id
           FROM   variables v
         ) v
         ON ( v.id = 1 )
UNION ALL
  SELECT REPLACE( equation, variable, value ),
         v.id,
         s.max_id
  FROM   substitutions s
         INNER JOIN
         variables v
         ON ( s.id + 1 = v.id )
)
SELECT equation
FROM   substitutions
WHERE  id = max_id

输出

|方程 | | :---------------------------------------------------- | | {(1000+20000)*(10000+20000)*(10000+1000)} | | {(20000+10000)} |

db小提琴here

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2010-10-04
    • 2015-10-11
    • 2011-11-24
    相关资源
    最近更新 更多