oracle 正则表达式和 MERGE

Posted

技术标签:

【中文标题】oracle 正则表达式和 MERGE【英文标题】:oracle regular expression and MERGE 【发布时间】:2013-07-01 05:47:49 【问题描述】:

作为更新我之前的question,

我有一些换行符分隔的字符串。 我需要将每个单词插入表格中。 新的逻辑及其条件是,如果不存在则插入,或者将相应的计数更新1。(就像使用MERGE一样)。 但是我当前的查询只是使用插入,所以我使用了 CONNECT BY LEVEL 方法而不检查值是否存在。

它的语法有点像:

if the word already EXISTS THEN
UPDATE my_table set w_count = w_count +1 where word = '...';
else
INSERT INTO my_table (word, w_count)
SELECT REGEXP_SUBSTR(i_words, '[^[:cntrl:]]+', 1 ,level),
     1
FROM dual
     CONNECT BY REGEXP_SUBSTR(i_words, '[^[:cntrl:]]+', 1 ,level) IS NOT NULL;
end if;

【问题讨论】:

【参考方案1】:

试试这个

MERGE INTO my_table m
    USING(WITH the_data AS (
          SELECT 'a
                  bb

                  &
                  c' AS dat
          FROM dual
        )
         SELECT regexp_substr(dat, '[^[:cntrl:]]+', 1 ,LEVEL) wrd
         FROM the_data
         CONNECT BY regexp_substr(dat, '[^[:cntrl:]]+', 1 ,LEVEL) IS NOT NULL) word_list
    ON (word_list.wrd = m.word)
    WHEN matched THEN UPDATE SET m.w_count = m.w_count + 1
    WHEN NOT matched THEN insert(m.word,m.w_count) VALUES (word_list.wrd,1);

关于MERGEhere的更多详情。

示例fiddle

【讨论】:

太棒了!!太棒了..谢谢@horrendous-space-kablooie。唯一的问题是我无法按照 Oracle 文档正确使用序列(没有间隙)。

以上是关于oracle 正则表达式和 MERGE的主要内容,如果未能解决你的问题,请参考以下文章

oracle 正则表达式?=

oracle 正则表达式?=

oracle 正则表达式

2015.3.20 Oracle使用正则表达式

如何利用oracle正则表达式去除字段中含有的汉字

oracle 正则表达式如何提取AABAAB类型的数据?