备注:测试数据库版本为MySQL 8.0
如需要scott用户下建表及录入数据语句,可参考:
scott建表及录入数据sql脚本
一.需求
遍历一个字符,并将其中的每个字符都作为一行返回,但是sql没有循环操作
例如:
要将表EMP中ENAME值为’KING’的字符串显示为4行,每行中都包含"KING"中的一个字符
二.解决方案
使用笛卡尔积生成行号,用来在该行中返回字符串中的每个字符。
然后使用MySQL内置的字符串分析函数来摘出所要的字符。
代码:
-- 解决 t10这样一个表来形成笛卡尔积
select substr(e.ename,iter.pos,1) as C
from (select ename from emp where ename = 'KING') e,
(select id as pos from t10) iter
where iter.pos <= length(e.ename)
测试记录:
mysql> create table t10(id int);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t10 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> select * from t10;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+------+
10 rows in set (0.00 sec)
mysql> select substr(e.ename,iter.pos,1) as C
-> from (select ename from emp where ename = 'KING') e,
-> (select id as pos from t10) iter
-> where iter.pos <= length(e.ename);
+------+
| C |
+------+
| K |
| I |
| N |
| G |
+------+
4 rows in set (0.00 sec)
mysql>