ORACLE遍历字符串

SQL> select * from t10;

        ID
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

SQL> select substr(e.ename,iter.id,1) as C
  2  from
  3  (select ename from emp where ename='KING') e,
  4  (select id from t10) iter
  5  where iter.id<=length(e.ename);

C
---
K
I
N
G

 

t10表只是个辅助表而已,书上称之为“基干表”。在这里有一点需要注意的就是这里的字符串'KING'长度是小于10的,所以在这里使用t10可以实现我们的需求。假若字符串长度大于10,那么就不行了。

所以我们应该保证基干表中的行数要大于字符串的长度才行。

 

把前面那个查询分拆一下,有益于理解这个语句实现的过程。

SQL> select e.ename,iter.id
  2  from
  3  (select ename from emp where ename='KING') e,
  4  (select id from t10) iter
  5  ;

ENAME              ID
---------- ----------
KING                1
KING                2
KING                3
KING                4
KING                5
KING                6
KING                7
KING                8
KING                9
KING               10

10 rows selected.

这里通过两个子查询做了一个笛卡尔积,1*10=10,所以有10条记录。

SQL> select e.ename,iter.id
  2  from
  3  (select ename from emp where ename='KING') e,
  4  (select id from t10) iter
  5  where iter.id<=length(e.ename);

ENAME              ID
---------- ----------
KING                1
KING                2
KING                3
KING                4

通过一个where条件iter.id<=length(e.ename),来控制返回的行数与字符串长度相等。

 

接着再使用substr函数,就可以通过使用ENAME作为源字符串,ID作为截取字符串的起始位置,1为截取长度,来达到目的了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值