WITH RECURSIVE cte AS (
SELECT id, name,
1 AS idx,
RIGHT(LEFT(name, 1),1) AS letter
FROM tab
UNION ALL
SELECT id, name,
idx + 1 AS idx,
RIGHT(LEFT(name, idx+1), 1) AS letter
FROM cte
WHERE idx < LENGTH(name)
)
SELECT id, letter FROM cte
with n as (
select * from (values row(1),row(2),row(3),row(4),row(5),row(6),row(7),row(8),row(9))x(num)
)
select t.id, Substring(name, n.num, 1)
from t
join n on n.num <= Length(t.name);
3条答案
按热度按时间0kjbasz61#
一种选择是使用递归查询,使用以下两个步骤:
LEFT(RIGHT(1), n)
获取第n个字母,LEFT(RIGHT(1), n)
提取第n个字母。当第n个提取元素大于字符串的长度时,停止递归。
输出:
| 身份证|字母|
| - ------|- ------|
| 1个|b.人口基金|
| 1个|项目a|
| 1个|数量|
| 1个|项目a|
| 1个|数量|
| 1个|项目a|
检查here演示。
e5njpo682#
一个简单的方法是与数字表连接:
DB Fiddle
bakd9h0s3#
另一种性能更高的方法是使用
REGEXP_REPLACE
、json_array
和json_table
REGEXP_REPLACE
将香蕉转换为b,n,a,n,ajson_array
从B,n,a,n,a创建json数组json_table
将JSON数据转换为表格数据。Demo here