Oracle:根据数据集替换选项字符串-这可能吗?

q4za4

我在表中的列看起来像这样:

PATTERN
{([option1]+[option2])*([option3]+[option4])}
{([option1]+[option2])*([option3]+[option4])*([option6]+[option7])}
{[option1]+[option6]}
{([option1]+[option2])*([option8]+[option9])}
{([option1]+[option2])*[option4]}
{[option10]}

每个选项都有数字值。有表格-我们称它为option_set,记录看起来像

OPTION      VALUE
option1     3653265
option2     26452
option3     73552
option3     100
option4     1235
option5     42565
option6     2330
option7     544
option9     2150

我想将选项名称替换为第一张表中的数字,如果存在,如果不存在,则= 0。我已经在PLSQL中完成了此操作(获取模式,遍历每个选项,如果存在-regexp_replace),但是我想知道是否可以在SQL中完成?我的目标是替换当前OPTION_SET的所有模式的值并仅获取所有方程均大于0的记录。当然-我无法在sql中运行此方程,所以我想到了类似的方法

for rec in
(
  SELECT...
)
loop
  execute immediate '...';
  if above_equation > 0 then ..
end loop;

任何想法,将不胜感激

Astentx

您可以使用递归CTE在SQL中执行类似循环的查询,并在每次迭代时替换新令牌,因此,您可以替换所有令牌。我知道在Oracle中的SQL语句中执行动态查询的唯一方法是DBMS_XMLGEN包,因此无需PL / SQL,您就可以评估表达式并根据结果值进行过滤。但是所有这些对于具有模式和选项的低基数表都是可行的。

这是代码:

with a as (
  select 1 as id, '{([option1]+[option2])*([option3]+[option4])}' as pattern from dual union all
  select 2 as id, '{([option1]+[option2])*([option3]+[option4])*([option6]+[option7])}' as pattern from dual union all
  select 3 as id, '{[option1]+[option6]}' as pattern from dual union all
  select 4 as id, '{([option1]+[option2])*([option8]+[option9])}' as pattern from dual union all
  select 5 as id, '{([option1]+[option2])*[option4]}' as pattern from dual union all
  select 6 as id, '{[option10]}]' as pattern from dual
)
, opt as (
  select 'option1' as opt, 3653265 as val from dual union all
  select 'option2' as opt, 26452 as val from dual union all
  select 'option3' as opt, 73552 as val from dual union all
  select 'option3' as opt, 100 as val from dual union all
  select 'option4' as opt, 1235 as val from dual union all
  select 'option5' as opt, 42565 as val from dual union all
  select 'option6' as opt, 2330 as val from dual union all
  select 'option7' as opt, 544 as val from dual union all
  select 'option9' as opt, 2150 as val from dual
)
, opt_ordered as (
  /*Order options to iterate over*/
  select opt.*, row_number() over(order by 1) as rn
  from opt
)
, rec (id, pattern, repl_pattern, lvl) as (
  select
    id,
    pattern,
    pattern as repl_pattern,
    0 as lvl
  from a
  
  union all
  
  select
    r.id,
    r.pattern,
    /*Replace each part at new step*/
    replace(r.repl_pattern, '[' || o.opt || ']', o.val),
    r.lvl + 1
  from rec r
    join opt_ordered o
      on r.lvl + 1 = o.rn
)
, out_prepared as (
  select
    rec.*,
    case
      when instr(repl_pattern, '[') = 0
      /*When there's no more not parsed expressions, then we can try to evaluate them*/
      then dbms_xmlgen.getxmltype(
        'select ' || replace(replace(repl_pattern, '{', ''), '}', '')
        || ' as v from dual'
      )
      /*Otherwise SQL statement will fail*/
    end as parsed_expr
  from rec
  /*Retrieve the last step*/
  where lvl = (select max(rn) from opt_ordered)
)
select
  id,
  pattern,
  repl_pattern,
  extractvalue(parsed_expr, '/ROWSET/ROW/V') as calculated_value
from out_prepared o
where extractvalue(parsed_expr, '/ROWSET/ROW/V') > 0
ID | 模式| REPL_PATTERN | CALCULATED_VALUE- 
:| :------------------------------------------------- ----------------- | :---------------------------------------- | :--------------- 
 1 | {([option1] + [option2])*([option3] + [option4])} | {(3653265 + 26452)*(73552 + 1235)} | 275194995279     
 2 | {([选项1] + [选项2])*([选项3] + [选项4])*([选项6] + [选项7])} | {(3653265 + 26452)*(73552 + 1235)*(2330 + 544)} | 790910416431846 
 3 | {[option1] + [option6]} | {3653265 + 2330} | 3655595         
 5 | {([option1] + [option2])* [option4]} | {(3653265 + 26452)* 1235} | 4544450495      

db <>在这里拨弄

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C语言中的字符串操作:这可能吗?

来自分类Dev

BeautifulSoup仅查找属性包含子字符串的元素?这可能吗?

来自分类Dev

将ajax调用字符串转换为实际的延迟对象,这可能吗?

来自分类Dev

在SQL数据库和EF6中保存标志枚举。这可能吗?

来自分类Dev

首先从数据库模型自动更新代码,这可能吗?

来自分类Dev

在数据库中做算术运算。这可能吗?

来自分类Dev

Redis数据结构:键->字段->值列表这可能吗?

来自分类Dev

使用 dd 完成数据传输 - 这可能吗?

来自分类Dev

在Django Url Dispatcher中获取http请求数据?这可能吗?如果是这样,怎么办?

来自分类Dev

LESS变量:这可能吗

来自分类Dev

typedef模板,这可能吗?

来自分类Dev

如何有效替换字符串中的字符,这可能会重复

来自分类Dev

在我的django项目中,数据库列顺序与模型字段声明顺序不匹配-这可能是个问题吗?

来自分类Dev

为在网站上注册的每个用户动态创建一个数据库表,这可能是解决方案吗?

来自分类Dev

JavaFX CustomControl <T>:这可能吗?

来自分类Dev

高级(My)SQL查询,这可能吗?

来自分类Dev

Photoshop Actions-这可能吗?

来自分类Dev

从子类获取属性-这可能吗?

来自分类Dev

参数化ResourceDictionary-这可能吗?

来自分类Dev

这可能是硬件问题吗?

来自分类Dev

du-排除目录-这可能吗?

来自分类Dev

在编码中这可能吗

来自分类Dev

Photoshop Actions-这可能吗?

来自分类Dev

在路径中使用变量,这可能吗?

来自分类Dev

从 URL 加载 .fbx 文件——这可能吗?

来自分类Dev

我希望能够在excel的框中输入一个百分比,并让高于该百分比的所有数据都通过,这可能吗?

来自分类Dev

jQuery删除元素上的包装器,这可能吗?

来自分类Dev

这可能是Scala编译器错误吗?

来自分类Dev

在Matlab中使用补丁绘制球体,这可能吗?

Related 相关文章

  1. 1

    C语言中的字符串操作:这可能吗?

  2. 2

    BeautifulSoup仅查找属性包含子字符串的元素?这可能吗?

  3. 3

    将ajax调用字符串转换为实际的延迟对象,这可能吗?

  4. 4

    在SQL数据库和EF6中保存标志枚举。这可能吗?

  5. 5

    首先从数据库模型自动更新代码,这可能吗?

  6. 6

    在数据库中做算术运算。这可能吗?

  7. 7

    Redis数据结构:键->字段->值列表这可能吗?

  8. 8

    使用 dd 完成数据传输 - 这可能吗?

  9. 9

    在Django Url Dispatcher中获取http请求数据?这可能吗?如果是这样,怎么办?

  10. 10

    LESS变量:这可能吗

  11. 11

    typedef模板,这可能吗?

  12. 12

    如何有效替换字符串中的字符,这可能会重复

  13. 13

    在我的django项目中,数据库列顺序与模型字段声明顺序不匹配-这可能是个问题吗?

  14. 14

    为在网站上注册的每个用户动态创建一个数据库表,这可能是解决方案吗?

  15. 15

    JavaFX CustomControl <T>:这可能吗?

  16. 16

    高级(My)SQL查询,这可能吗?

  17. 17

    Photoshop Actions-这可能吗?

  18. 18

    从子类获取属性-这可能吗?

  19. 19

    参数化ResourceDictionary-这可能吗?

  20. 20

    这可能是硬件问题吗?

  21. 21

    du-排除目录-这可能吗?

  22. 22

    在编码中这可能吗

  23. 23

    Photoshop Actions-这可能吗?

  24. 24

    在路径中使用变量,这可能吗?

  25. 25

    从 URL 加载 .fbx 文件——这可能吗?

  26. 26

    我希望能够在excel的框中输入一个百分比,并让高于该百分比的所有数据都通过,这可能吗?

  27. 27

    jQuery删除元素上的包装器,这可能吗?

  28. 28

    这可能是Scala编译器错误吗?

  29. 29

    在Matlab中使用补丁绘制球体,这可能吗?

热门标签

归档