MySQL 分割字符串为数组 split

在数据库应用程序中,经常会遇到需要将字符串分割成数组的需求。MySQL 提供了一些内置函数来实现字符串分割操作,本文将介绍如何使用这些函数将字符串分割成数组。

1. 字符串分割的常见场景

在很多实际应用中,我们经常会遇到需要将一个字符串按照指定的分隔符进行拆分并保存成数组的需求。举个例子,一个用户可能有多个爱好,我们将这些爱好以逗号分隔的形式保存在数据库中,如下所示:

CREATE TABLE `user` (
  `id` INT NOT NULL,
  `name` VARCHAR(100) NOT NULL,
  `hobbies` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `user` (`id`, `name`, `hobbies`) VALUES
(1, '张三', '篮球,游泳,旅行'),
(2, '李四', '音乐,电影,阅读');

在这种情况下,我们可能需要将用户的爱好分割成数组,以便进行更方便的处理和查询。

2. 使用 MySQL 内置函数实现字符串分割

MySQL 提供了一些内置函数来实现字符串分割操作,这里我们将介绍两种常见的方法。

2.1 使用 SUBSTRING_INDEX 函数

SUBSTRING_INDEX 函数可以按照指定的分隔符将字符串分割成多个部分,并返回指定部分的子字符串。

下面的示例代码演示了如何使用 SUBSTRING_INDEX 函数将字符串分割成数组:

SELECT
  `id`,
  `name`,
  SUBSTRING_INDEX(`hobbies`, ',', 1) AS hobby1,
  SUBSTRING_INDEX(SUBSTRING_INDEX(`hobbies`, ',', 2), ',', -1) AS hobby2,
  SUBSTRING_INDEX(SUBSTRING_INDEX(`hobbies`, ',', 3), ',', -1) AS hobby3
FROM
  `user`;

上述代码中,SUBSTRING_INDEX(hobbies, ',', 1) 表示获取 hobbies 字段中以逗号为分隔符的第一个部分,SUBSTRING_INDEX(SUBSTRING_INDEX(hobbies, ',', 2), ',', -1) 表示获取 hobbies 字段中以逗号为分隔符的第二个部分。

2.2 使用 FIND_IN_SET 函数

FIND_IN_SET 函数可以在一个字符串列表中查找指定的字符串,并返回其位置。

下面的示例代码演示了如何使用 FIND_IN_SET 函数将字符串分割成数组:

SELECT
  `id`,
  `name`,
  SUBSTRING_INDEX(`hobbies`, ',', FIND_IN_SET(',', `hobbies`) - 1) AS hobby1,
  SUBSTRING_INDEX(SUBSTRING_INDEX(`hobbies`, ',', FIND_IN_SET(',', `hobbies`) + 1), ',', -1) AS hobby2,
  SUBSTRING_INDEX(SUBSTRING_INDEX(`hobbies`, ',', FIND_IN_SET(',', `hobbies`) + 2), ',', -1) AS hobby3
FROM
  `user`;

上述代码中,FIND_IN_SET(',',hobbies) 表示查找 hobbies 字段中逗号的位置,SUBSTRING_INDEX(hobbies, ',', FIND_IN_SET(',',hobbies) + 1) 表示获取 hobbies 字段中以逗号为分隔符的第二个部分。

3. 将分割后的数组保存到新表

在实际应用中,我们可能需要将分割后的数组保存到新的表中以供后续使用。下面的代码展示了如何将分割后的数组保存到新表中:

CREATE TABLE `user_hobbies` (
  `id` INT NOT NULL,
  `hobby` VARCHAR(100) NOT NULL
);

INSERT INTO `user_hobbies` (`id`, `hobby`)
SELECT
  `id`,
  SUBSTRING_INDEX(`hobbies`, ',', 1) AS hobby
FROM
  `user`
UNION ALL
SELECT
  `id`,
  SUBSTRING_INDEX(SUBSTRING_INDEX(`hobbies`, ',', 2), ',', -1) AS hobby
FROM
  `user`
UNION ALL
SELECT
  `id`,
  SUBSTRING_INDEX(SUBSTRING_INDEX(`hobbies`, ',', 3), ',', -1) AS hobby
FROM
  `user`;

上述代码中,我们使用