【问题标题】:How split word in rows MysqlMysql如何分行分词
【发布时间】: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


    【解决方案1】:

    一种选择是使用递归查询来执行此操作,使用以下两个步骤:

    • 基础步骤:获取位置1的字母
    • 递归步骤:获取第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
    

    输出:

    id letter
    1 b
    1 a
    1 n
    1 a
    1 n
    1 a

    查看演示 here

    【讨论】:

      【解决方案2】:

      一个简单的方法是加入一个数字表:

      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

      【讨论】:

      • 但是在这种情况下,据我了解,我在查询中输入的row(i) 的数量是有限的,以至于在您的示例中我增加了单词的字符并且只使 9 行正确?
      • CTE 是如何使用数字表的示例 - 您可以向 cte 添加足够的内容以满足最大长度的字符串,或者使用永久性数字表,这是一种常见模式,通常称为理货表
      【解决方案3】:

      另一种更高效的方法是使用REGEXP_REPLACEjson_arrayjson_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;
      

      Demo here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-04
        • 2019-07-24
        • 1970-01-01
        • 2011-02-23
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多