oraclesql中的Regex前瞻

oraclesql中的Regex前瞻,sql,regex,oracle,Sql,Regex,Oracle,我试图在我的表中找到某些字符串。 我只需要显示包含这些字符的记录。 例如,我有以下表格: TABLE_A ================= # | COL_A ================= 1 | ABC 2 | _ABC_ 3 | _ABCD_ABC_ 4 | ABCD 我想选择所有有ABC但没有ABCD的记录。 在上面的示例表中,应显示记录1、2和3。 目前我想到的最好的方法是: SELECT * FROM TABLE_A WHERE REGEXP_LIKE(COL_A,

我试图在我的表中找到某些字符串。 我只需要显示包含这些字符的记录。 例如,我有以下表格:

TABLE_A
=================
 # | COL_A
=================
 1 | ABC
 2 | _ABC_
 3 | _ABCD_ABC_
 4 | ABCD
我想选择所有有ABC但没有ABCD的记录。 在上面的示例表中,应显示记录1、2和3。 目前我想到的最好的方法是:

SELECT * FROM TABLE_A WHERE REGEXP_LIKE(COL_A, 'ABC[^D]{1,}', 'inm');
上述语句的问题在于,如果数据末尾只有ABC,则不会显示


PS:这在纯SQL中是可行的吗?

您可以使用
这样的
来实现:

where '_' || col_a || '_' like '%$_ABC$_%' escape '$'

但是,在一列中存储多个代码不是SQLish存储数据的方式。你应该修正你的数据结构,特别是如果你关心性能的话。

你可以使用
[^D]$
来匹配非
D
字符或行尾:

SELECT *
FROM   TABLE_A
WHERE  REGEXP_LIKE(COL_A, 'ABC([^D]|$)', 'i');

查找
'ABC'
以行首或下划线开头,以下划线或行尾结尾的行

SQL> with table_a(ID, col_a) as (
     select 1, 'ABC'        from dual union all
     select 2, '_ABC_'      from dual union all
     select 3, '_ABCD_ABC_' from dual union all
     select 4, 'ABCD'       from dual
   )
   select id, col_a
   from table_a
   where regexp_like(col_a, '(^|_)ABC(_|$)');

        ID COL_A
---------- ----------
         1 ABC
         2 _ABC_
         3 _ABCD_ABC_

SQL>

修复您的数据结构,使您不以分隔字符串存储列表。PL/SQL是Oracle的过程语言-您只使用SQL。分隔符是什么?@GordonLinoff,这实际上不是列表。这只是这个问题的样本数据。在实际环境中,它们是备注、描述、名称等。很抱歉误导您。如果我只需要添加排除,我只需要将其添加到括号内,对吗?例如,[^DZ]如果我不想匹配ABCD和ABCZ。