MySQL数据库中,将一个字段的值分割成多条数据显示

本文介绍在MySQL中将存储为字符串的外键数据进行分割的方法,通过创建辅助表sequence并使用两种SQL查询方式,实现字符串字段的高效拆分,以便进行关联查询。

 

本文主要记录如何在MySQL数据库中,将一个字符串分割成多条数据显示。

外键有时是以字符串的形式存储,例如 12,13,14 这种,如果以这种形式存储,则不能直接与其他表关联查询,此时就需要将该字段的值分割再关联查询。

下图是一条测试数据,表名为 test 

 

想达到的效果如下图所示

为实现功能,需要新建一个表,该表只有一个字段,字段命名为id,表名称为 sequence 

表中需要预先置入一些值,主要是便于分割判断,一般该数值取决于要分割字符串的长度,但长度 100 应该是够了。

下面分享两种可以实现效果的 SQL ,这两个SQL的最主要区别就是对 sequence 中值的要求。

 

第一种对 sequence 表的要求就是值要从 0 开始。

SELECT
    t.id,
    SUBSTRING_INDEX(
        SUBSTRING_INDEX(t. DATA, ',', s.id + 1),
        ',' ,- 1
    ) AS DATA
FROM
    test t
JOIN sequence s ON s.id < (
    LENGTH(t. DATA) - LENGTH(REPLACE(t. DATA, ',', '')) + 1
)

值从0开始的结果

 

值从1开始的结果

 

第二种对 sequence 表的要求就是值要从 1 开始

SELECT
    t.id,
    REPLACE (
        SUBSTRING_INDEX(DATA, ',', s.id),
        CONCAT(
            SUBSTRING_INDEX(DATA, ',', s.id - 1),
            ','
        ),
        ''
    ) AS DATA
FROM
    sequence s
CROSS JOIN (
    SELECT
        id,
        CONCAT(DATA, ',') AS DATA,
        LENGTH(DATA) - LENGTH(REPLACE(DATA, ',', '')) + 1 AS dataSize
    FROM
        test
) t ON s.id <= t.dataSize

 

值从1开始的结果

 

值从 0 开始的结果

 

 希望对看到这篇文章的你有所帮助。

转载于:https://www.cnblogs.com/hs2018/p/9446248.html

在不同的数据库中,将多个字段拼接同一条数据中的一个字段有不同的方法。 ### MySQL MySQL 提供了 `CONCAT` 和 `CONCAT_WS` 函数来实现字段拼接。 - `CONCAT` 函数可以将多个字符串连接一个字符串。示例 SQL 如下: ```sql -- 假设名为 student,包含 studentID、studentName、studentScore 字段 SELECT CONCAT(studentID, studentName, studentScore) AS combined_field FROM student; ``` - `CONCAT_WS` 函数可以在待拼接的字符串之间加入指定的分割符。它的第一个参数为采用的分隔符,而剩下的参数则为待拼接的字符串。示例 SQL 如下: ```sql SELECT CONCAT_WS('-', studentID, studentName, studentScore) AS combined_field FROM student; ``` ### Oracle 在 Oracle 中,可以使用 `||` 操作符进行字符串拼接,也可以使用 `XMLAGG` 函数处理多行记录拼接。例如将多个字段拼接: ```sql SELECT application_no || '-' || INDIVIDUAL_NAME || '-' || customer_name AS combined_field FROM A; ``` 对于多行记录合并一个字段,可参考如下 SQL(将同一个 `application_no` 的 `customer_name` 合并): ```sql SELECT application_no, INDIVIDUAL_NAME, RTRIM(XMLAGG(XMLPARSE(CONTENT to_char(customer_name) || '、' WELLFORMED)).GETCLOBVAL(), '、') as combined_name FROM A GROUP BY application_no, INDIVIDUAL_NAME; ``` ### 示例数据及查询 以引用 [1] 中的 `student` 为例,若要将 `studentID`、`studentName`、`studentScore` 拼接一个字段,使用 MySQL 的 `CONCAT` 函数示例如下: ```sql -- 结构 CREATE TABLE student ( studentID VARCHAR(10), studentName VARCHAR(50), studentScore INT ); -- 插入数据 INSERT INTO student (studentID, studentName, studentScore) VALUES ('01', 'Alice', 90), ('02', 'Bill', 95), ('03', 'Cindy', 100); -- 拼接字段 SELECT CONCAT(studentID, studentName, studentScore) AS combined_field FROM student; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值