sql - Oracle:复杂情况的正则表达式

标签 sql regex oracle

我有一个表,其中一列包含一个字符串,其中的项目以分号 (;) 分隔

我想根据字符串的模式有选择地将数据传输到新表。

例如,它可能看起来像

16;;14;30;24;11;13;14;14;10;13;18;15;18;24;13/18;11;;23;12;;19;10;;11;26;;;42;26;38/39;12;;;;;;;11;;;;;;;;;;;;;;;

11;;11;11;11;11;11;11;11;11;11;11;11;11;11;11;11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

我不关心分号之间的内容,但我关心哪些位置包含项目。例如,如果我只想第 1、3、4 个位置包含项目,我将允许以下...

32;;14;18/12;;;;;;;;; or 32;;14;18/12;;;;55;;;;11;;;;;;;

下面这个不行,因为第三个位置没有任何值(value)。

32;;;18/12;;;;;;;;;

如果正则表达式适用于此,那么我可以使用merge into 将所需的记录移动到目标表。如果无法做到这一点,我将不得不用 Java 处理每条记录,并有选择地将记录插入到新表中。

源表:

id | StringValue | count

目标表:

id | StringValue | count

我想到的sql:

merge into you_target_table tt
using ( select StringValue, count
        from source_table where REGEXP_LIKE ( StringValue, 'some pattern')
      ) st
on ( st.StringValue = tt.StringValue and st.count=tt.count )
when not matched then
   insert (id, StringValue , count) 
   values (someseq.nextval, st.value1, st.count)
when matched then
   update
   set tt.count = tt.count + st.count;

此外,我确信源表中的所有 StringValue 都是唯一的,因此 when matches then 之后的内容并不重要,但由于语法,我认为我必须有一些东西。

最佳答案

对于每个位置,您希望输入一个值 [^;]+;,该值与 ; 以外的任何字符匹配,并且至少出现一次,后跟一个;。如果您不喜欢某个位置,请输入[^;]*;。这几乎与第一个类似,但 ; 之前的字符也可能没有。使用 ^ 将整个内容锚定到开头。

因此,对于您的第一、第三和第四位置示例,您将得到:

^[^;]+;[^;]*;[^;]+;[^;]+;

在如下查询中:

SELECT *
       FROM elbat
       WHERE regexp_like(nmuloc, '^[^;]+;[^;]*;[^;]+;[^;]+;');

db<>fiddle

可以通过将子表达式放在一个组中来进一步改进,即在它们两边加上括号,并使用量词——组后面花括号中的数字。例如 ([^;]+;){2} 将匹配两个非空位置。您的示例将缩短为:

^[^;]+;[^;]*;([^;]+;){2}

关于sql - Oracle:复杂情况的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53967155/

相关文章:

c# - 正则表达式问题 C#

regex - 替换给定 unicode 字符串中的所有表情符号

python - 正则表达式将 3 组 : 1st word, 最后一个单词和句子的其余部分

sql - 在 PL/SQL 存储过程中返回自定义类型

database - 在 Oracle 11g R2 中解锁帐户

sql - SQL Server 中具有多列的“In”子句

sql - 如何检查 View 是否存在,如果不存在则创建

c# - 不能将 null 值分配给类型为 System.Int32 的成员,该类型是不可为 null 的值类型

spring - session /实体管理器已关闭

mysql - SQL-如何在聚合操作期间获取每组重复次数最多的文本值?