oracle 波浪号不识别,在Oracle中使用包含波浪号分隔数据的列

您可以使用正则表达式来解析单个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在他的博客中的表现。

您通常会更好地修复您的数据模型。在列中存储分隔的数据违反了基本的规范化原则。如果您已将数据存储在单独的列中(大概在与现有表格有一对多关系的单独表格中),则可以对数据建立索引,并且可以创建映射到预定义的有效列表的外键约束值,因此您可以防止首先插入无效数据(或至少防止将来添加新的无效行)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值