在PL \ SQL

时间:2017-05-04 13:26:50

标签: regex plsql oracle11g plsqldeveloper

我正在尝试匹配CLOB中包含的多行字段中的两行。这是我想要做的一个例子:

SELECT MULTI_LINE_TXT,
       REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$', 1, 'm') AS ID_1_CNT, --Works as expected
       REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$^Port3$', 1, 'm') AS PORT_3_ID_1_CNT --Does not work how I am hoping
  FROM (SELECT 'EVENT TYPE ID: 1' || CHR(10) || 'Port3' || CHR(10) || 'EVENT TYPE ID: 2' || CHR(10) || 'Port3' || CHR(10) ||
               'EVENT TYPE ID: 1' || CHR(10) || 'Port3' || CHR(10) || 'EVENT TYPE ID: 2' || CHR(10) || 'Port3' || CHR(10) ||
               'EVENT TYPE ID: 1' || CHR(10) || 'Port4' || CHR(10) || 'EVENT TYPE ID: 2' || CHR(10) || 'Port4' AS MULTI_LINE_TXT
          FROM DUAL)

示例输出:

ROW |   MULTI_LINE_TXT      |   ID_1_CNT    |   PORT_3_ID_1_CNT
---------------------------------------------------------------
1   |   EVENT TYPE ID: 1    |   3           |   0
    |   Port3               |               |
    |   EVENT TYPE ID: 2    |               |
    |   Port3               |               |
    |   EVENT TYPE ID: 1    |               |
    |   Port3               |               |
    |   EVENT TYPE ID: 2    |               |
    |   Port3               |               |
    |   EVENT TYPE ID: 1    |               |
    |   Port4               |               |
    |   EVENT TYPE ID: 2    |               |
    |   Port4               |               |

我拥有的第一个正则表达式:

REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$', 1, 'm') AS ID_1_CNT

按预期计算EVENT TYPE ID: 1的所有事件。我遇到的问题是我不知道这个事件对应哪个端口,除非我也引用了以下行。

我尝试引用下一行做这样的事情:

REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$^Port3$', 1, 'm') AS PORT_3_ID_1_CNT

但正如您在我的示例输出中所看到的那样,这似乎不像我希望的那样工作,并且当我期望计数为2时,它总是返回0,

有谁知道我做错了什么,或者可能采取不同的方式试图解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

现在好吧,我不觉得自己觉得愚蠢....我在发布此消息后几分钟就找到了解决方案。

我没有尝试匹配行尾$和行^的开头,而是通过将其连接在一起直接匹配新行:

REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1' || CHR(10) || 'Port3$', 1, 'm') AS PORT_3_ID_1_CNT

当我这样做时,它返回我希望的2的计数。