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为截取长度,来达到目的了。