将列值与存储在另一个表中的正则表达式列表进行比较并相应地更新

时间:2014-12-27 17:38:15

标签: regex oracle oracle11g

我是Oracle编程的新手。
我想查看" msg"值"表1和#34;反对"正则表达式"来自"表2和#34;的值 如果正则表达式如此匹配,我想更新相应的" regex_id"在"表1"。

常见查询:SELECT 'match found' FROM DUAL WHERE REGEXP_LIKE('s 27', '^(s27|s 27)')

表1

MSG      REG_EXID
Ss27        ?
s27         ?
s28         ?
s29         ?

表2

REGEX       REG_EXID  RELEVANCE
^(s27|s 27)        1  10
^(s29|s 29)        2  2
^(m28|m 28)        3  2
^(s27|s 27)        4  100

2 个答案:

答案 0 :(得分:1)

你可以一起工作

UPDATE Table1
SET reg_exID = (SELECT reg_exID FROM Table2 WHERE REGEXP_LIKE(Table1.msg, regex));

请记住:

  • 您当前的样本记录都不会更新,因为REGEX区分大小写。
  • 如果多个REGEX匹配,则上述UPDATE将失败。
  • 您可以在" ^ m?28"。
  • 中重写当前的REGEX表达式。

查看实际操作:SQL Fiddle(添加了一些数据以实际显示效果。)

如果需要澄清/调整,请发表评论。

答案 1 :(得分:1)

采用新增的"相关性"考虑到,使用Oracle 11g,您可以尝试

UPDATE Table1 T1
SET T1.reg_exID = 
  (SELECT DISTINCT
  MAX(reg_exID) KEEP (DENSE_RANK FIRST ORDER BY relevance DESC) OVER (PARTITION BY regex)
  FROM Table2
  WHERE REGEXP_LIKE(T1.msg, regex)
  )
;

请参阅SQL Fiddle