您可以使用正则表达式来解析单个SQL语句中的数据。然后,您可以将您想要的任何过滤器来找到一组不在预定值列表
SQL> ed
Wrote file afiedt.buf
1 with test as
2 (select 'ABC~DEF~GHI~JKL~MNO' str from dual)
3 select regexp_substr (str, '[^~]+', 1, rownum) split
4 from test
5* connect by level <= length (regexp_replace (str, '[^~]+')) + 1
SQL>/
SPLIT
----------------------------------------------------------------------------
ABC
DEF
GHI
JKL
MNO
你也可以做这样的事情
SQL> ed
Wrote file afiedt.buf
1 with test as
2 (select 1 id, 'ABC~DEF~GHI~JKL~MNO' str from dual union all
3 select 2, 'XY~PDQ~435' from dual union all
4 select 3, 'This~is~a~test' from dual)
5 select id, regexp_substr (str, '[^~]+', 1, e.lvl) split
6 from test,
7 (select level lvl
8 from dual
9 connect by level <= (select max(regexp_count(str,'~')) + 1
10 from test)) e
11* where regexp_substr (str, '[^~]+', 1, e.lvl) is not null
SQL>/
ID SPLIT
---------- --------------------
1 ABC
2 XY
3 This
1 DEF
2 PDQ
3 is
1 GHI
2 435
3 a
1 JKL
3 test
1 MNO
12 rows selected.
当然,这不会特别高效 - 你将不得不对表进行全面扫描,因为你无法有效地索引各种子字符串。还有其他方法可以生成这些行--Rob van Wijk的一篇文章比较了各种interval based row generation techniques在他的博客中的表现。
您通常会更好地修复您的数据模型。在列中存储分隔的数据违反了基本的规范化原则。如果您已将数据存储在单独的列中(大概在与现有表格有一对多关系的单独表格中),则可以对数据建立索引,并且可以创建映射到预定义的有效列表的外键约束值,因此您可以防止首先插入无效数据(或至少防止将来添加新的无效行)。