mysql - 如何使用 MYSQL 将字符串拆分为表中的多行?

标签 mysql sql

我有一个包含四个不同列的表格。它叫做盒子表。它包含不同盒子的特征。

以下是列的名称:序列号、箱子高度、箱子宽度、箱子重量。

第一列(序列号)是一个字符串,但它可以在一行中包含多个框,例如:(212,234)。如果一个字符串包含多个框,我想将该字符串拆分为不同的行(框的数量,由逗号数 + 1 决定)。当我这样做时,我希望其他列值也为新创建的行复制。例如

Serial Number: 1,2 | Box Height: 5 | Box Width: 2 | Box Weight: 100

改造后:

Row (1): Serial Number: 1 | Box Height: 5 | Box Width: 2 | Box Weight: 100
Row (2): Serial Number: 2 | Box Height: 5 | Box Width: 2 | Box Weight: 100 

我什至不明白如何开始这个问题。我最多只能从字符串中删除特殊字符。

最佳答案

一个典型的解决方案是生成一个数字列表(通过创建表或使用内联查询),然后将其与源数据JOIN,使用 MySQL 字符串函数提取相关部分序列号

这是一个使用内联查询的解决方案,每条记录最多可以处理 5 个连续出版物(要处理更多的连续出版物,您需要使用更多 UNION ALL 扩展子查询):

SELECT
    SUBSTRING_INDEX(
        SUBSTRING_INDEX(box.serial_number, ',', num.n), 
        ',', 
        -1
    ) new_serial_number,
    box.height,
    box.width,
    box.weight
FROM
    (
        SELECT 1 n
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
    ) num
    INNER JOIN box 
        ON CHAR_LENGTH(box.serial_number) 
               - CHAR_LENGTH(REPLACE(box.serial_number, ',', '')) 
           >= num.n - 1

这个 demo on DB Fiddle 您的示例数据返回:

| new_serial_number | height | width | weight |
| ----------------- | ------ | ----- | ------ |
| 1                 | 5      | 2     | 100    |
| 2                 | 5      | 2     | 100    |

关于mysql - 如何使用 MYSQL 将字符串拆分为表中的多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57861598/

相关文章:

php - 如何调用这个php函数

mysql - SQL:计算不同组变体的总平均值

mysql - 如何解析以下数据库模式

SQL 服务器 2008 : Trying to insert multiple rows using 1 SQL Statement

sql - 原因 - 如果指定了 SELECT DISTINCT,则 ORDER BY 项必须出现在选择列表中

mysql - 在 MySQL 中将字符串转换为十进制的问题

php - Laravel 对关系的 Eloquent 复杂查询

android - 使用 Glide 库从缓存加载不同的图像

php - 无法检索数据库信息

sql - 如何在 PostgreSQL 中以不同的方式使用 overlay()?