遍历字符串里的每个值
需求描述
需求:打印出ename为’King’的名字里每一个字母,每个字母占一行.
解决方法:通过自增表和emp表先cross join(笛卡尔积),然后再通过ename的len(ename的长度)进行过滤,最终得到显示每个字母的结果.
注: 数据库数据集SQL脚本详见如下链接地址
员工表结构和数据初始化SQL脚本
SQL代码
--SQL Server:
SELECT SUBSTRING(e.ENAME,seq.pos,1) AS ename_Split
FROM (SELECT ENAME FROM emp WHERE ename = 'KING' ) e,
(SELECT number AS pos FROM master.[dbo].[spt_values] WHERE type = 'P' AND number>0) seq
WHERE seq.pos<=LEN(e.ename)
执行结果
--Oracle:
WITH t(num) AS (
SELECT 1 FROM DUAL
UNION ALL
SELECT t.num+1
FROM t WHERE t.num<100
)
SELECT SUBSTR(e.ENAME,seq.num,1) AS ename_Split FROM
(SELECT ENAME FROM emp WHERE ename = 'KING' ) e,
(SELECT num FROM t)seq
WHERE seq.num<=LENGTH(e.ename)
--Mysql 8.0:
WITH RECURSIVE cte (num) AS
(
SELECT 1
UNION ALL
SELECT num + 1 FROM cte WHERE num < 100
)
SELECT SUBSTRING(e.ENAME,seq.num,1) AS ename_Split FROM
(SELECT ENAME FROM emp WHERE ename = 'KING' ) e,
(SELECT num FROM cte)seq
WHERE seq.num<=LENGTH(e.ename)