Замена символов в строке - вопрос оптимизации - PullRequest
1 голос
/ 20 января 2020

Есть строка:

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

И коллекция (таблица индекса pls_integer от varchar2 (3)):

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

К вашему сведению: эта коллекция заполняется через SELECT, поэтому можно использовать в задаче, которая описана ниже:

Моя цель - заменить символы в строке количеством из этой коллекции и получить:

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

Я уже сделал это в PL / SQL с использованием l oop, затем с помощью регулярного выражения найдите первое вхождение символа из 3 символов, заменив et c. et c.

МОЙ вопрос: возможно ли сделать это одним запросом?

Выбор образца:

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;

1 Ответ

3 голосов
/ 21 января 2020

Используйте рекурсивное условие подзапроса:

Запрос :

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

Вывод :

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

дБ <> скрипка здесь

...