在MySQL 5.7中拆分字符串,你可以利用一系列的字符串函数组合来实现。下面是一个示例,展示了如何在没有递归CTEs的情形下拆分逗号分隔的字符串:
假设你有一个表table1,个中有一个字段col1包含逗号分隔的字符串,你想要将这个字段拆分成多行。
SELECT

SUBSTRING_INDEX(SUBSTRING_INDEX(t.col1, ',', numbers.n), ',', -1) AS value
FROM
(SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) numbers
INNER JOIN table1 t ON CHAR_LENGTH(t.col1)
-CHAR_LENGTH(REPLACE(t.col1, ',', '')) >= numbers.n-1
WHERE
n <= 1 + (CHAR_LENGTH(t.col1) - CHAR_LENGTH(REPLACE(t.col1, ',', '')))
ORDER BY
t.col1,
n;
在这个查询中,我们创建了一个数字表numbers,它包含了一系列的数字,这些数字代表了可能的最大逗号数量。然后,我们利用INNER JOIN将这个数字表与table1连接起来,基于col1字段中逗号的数量。
SUBSTRING_INDEX函数用于获取逗号分隔的字符串中的特定部分。外部的SUBSTRING_INDEX用来获取第n个逗号之前的所有内容,而内部的SUBSTRING_INDEX用来从该子字符串中获取末了一个逗号之后的内容,即第n个值。
WHERE子句用于过滤那些由于逗号数量不敷而产生的空字符串。ORDER BY子句用于确保结果的顺序是精确的。
请把稳,这种方法依赖于你提前知道或者能够估计col1字段中可能涌现的最大逗号数量。你须要根据这个数量来扩展numbers表。上面的示例中,我们假设了最大逗号数量为3,因此只包含了到4的数字(由于n是从1开始的)。
如果你不愿定最大逗号数量,你可能须要在运用程序层面进行拆分,或者利用动态SQL来构建这个查询。但是,请把稳,动态SQL在MySQL中常日是通过存储过程来实现的,而在MySQL 5.7中,你不能直接在存储过程外部利用动态SQL。因此,对付繁芜的拆分需求,常日建议在运用程序中进行处理。