【发布时间】:2023-02-02 10:31:29
【问题描述】:
是否可以将一个单词拆分成单独的行?我发现的所有示例都使用一些东西来指代逗号或其他东西,但我想将每个字母与一个单词分开,例如:
来自(我的桌子):
| id | name |
|---|---|
| 1 | banana |
至:SELECT ...
| id | letter |
|---|---|
| 1 | b |
| 1 | a |
| 1 | n |
| 1 | a |
| 1 | n |
| 1 | a |
【问题讨论】:
标签: mysql
是否可以将一个单词拆分成单独的行?我发现的所有示例都使用一些东西来指代逗号或其他东西,但我想将每个字母与一个单词分开,例如:
来自(我的桌子):
| id | name |
|---|---|
| 1 | banana |
至:SELECT ...
| id | letter |
|---|---|
| 1 | b |
| 1 | a |
| 1 | n |
| 1 | a |
| 1 | n |
| 1 | a |
【问题讨论】:
标签: mysql
一种选择是使用递归查询来执行此操作,使用以下两个步骤:
LEFT(RIGHT(1), n),提取位置n的字母。
当第 n 个提取元素高于字符串的长度时,递归停止。
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
输出:
| id | letter |
|---|---|
| 1 | b |
| 1 | a |
| 1 | n |
| 1 | a |
| 1 | n |
| 1 | a |
查看演示 here。
【讨论】:
一个简单的方法是加入一个数字表:
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);
【讨论】:
row(i) 的数量是有限的,以至于在您的示例中我增加了单词的字符并且只使 9 行正确?
另一种更高效的方法是使用REGEXP_REPLACE、json_array和json_table
REGEXP_REPLACE转换香蕉到b,n,a,n,a
json_array 从中创建一个 json 数组b,n,a,n,a
json_table 会将 JSON 数据转换为表格数据。
with cte as (
select id, REGEXP_REPLACE(name, "(.)(?!$)", "$1,") as name
from _table
)
select cte.id, t.name
from cte
join json_table(
replace(json_array(cte.name), ',', '","'),
'$[*]' columns (name varchar(50) path '$')
) t;
【讨论】: