如何拆分字行Mysql

hec6srdp  于 2023-02-03  发布在  Mysql
关注(0)|答案(3)|浏览(115)

有没有可能把一个单词分成单独的行呢?我找到的所有例子都是用逗号之类的东西来指代,但我想把每个字母从一个单词中分开,例如:
来自(我的表):
| 身份证|姓名|
| - ------|- ------|
| 1个|香蕉|
至:SELECT ...
| 身份证|字母|
| - ------|- ------|
| 1个|B|
| 1个|项目a|
| 1个|数量|
| 1个|项目a|
| 1个|数量|
| 1个|项目a|

0kjbasz6

0kjbasz61#

一种选择是使用递归查询,使用以下两个步骤:

  • 基本步骤:获取位置1中的字母
  • 递归步骤:使用LEFT(RIGHT(1), n)获取第n个字母,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

输出:
| 身份证|字母|
| - ------|- ------|
| 1个|b.人口基金|
| 1个|项目a|
| 1个|数量|
| 1个|项目a|
| 1个|数量|
| 1个|项目a|
检查here演示。

e5njpo68

e5njpo682#

一个简单的方法是与数字表连接:

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);

DB Fiddle

bakd9h0s

bakd9h0s3#

另一种性能更高的方法是使用REGEXP_REPLACEjson_arrayjson_table
REGEXP_REPLACE香蕉转换为b,n,a,n,a
json_arrayB,n,a,n,a创建json数组
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;

Demo here

相关问题