将逗号分隔的字符串拆分为mysql中的行

Posted

技术标签:

【中文标题】将逗号分隔的字符串拆分为mysql中的行【英文标题】:Split comma separated string into rows in mysql 【发布时间】:2017-07-05 07:32:44 【问题描述】:

当我有像 1、2、3 这样的字符串列表时... 我想将其用作一列

Ids
1
2
3

可以通过sql查询吗?

ex) SELECT Ids from (1, 2, 3...)

【问题讨论】:

What is the opposite of GROUP_CONCAT in mysql?的可能重复 【参考方案1】:

使用任意数字的子查询来拆分您的字符串。您可以使用 '1,2,3' 而不是 vals。

SELECT
  DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(vals, ',', n.digit+1), ',', -1) val
FROM
  tt1
  INNER JOIN
  (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) n
  ON LENGTH(REPLACE(vals, ',' , '')) <= LENGTH(vals)-n.digit;

See it working

【讨论】:

抱歉,我有事要问。如果字符串的长度不固定,是否可以转换? 非常类似于this answer。【参考方案2】:

对于 MySQL 8.0.4+

SELECT *
FROM
  JSON_TABLE(
          CONCAT('[', '1,2,3,4', ']'),
          "$[*]"
          COLUMNS(
              ids BIGINT(20) PATH "$"
              )
      ) AS tt

在您的字符串周围连接方括号 ([]) 以使其成为 JSON 数组。然后使用JSON_TABLE 将其转换为表格。请参阅MySQL JSON Table Functions 了解更多信息。

【讨论】:

【参考方案3】:

您可以使用以下存储过程来拆分由任何字符分隔的字符串:

CREATE PROCEDURE `split_delimited` (
IN inputstr NVARCHAR(1000),
IN delimiter CHAR(1)
)
BEGIN
DROP TEMPORARY TABLE Items;
CREATE TEMPORARY TABLE Items(item NVARCHAR(50)); 
WHILE LOCATE(delimiter,inputstr) > 1 DO
INSERT INTO Items SELECT SUBSTRING_INDEX(inputstr,delimiter,1);
SET inputstr = REPLACE (inputstr, (SELECT LEFT(inputstr,LOCATE(delimiter,inputstr))),'');
END WHILE;
INSERT INTO Items(item) VALUES(inputstr);
select * from Items;
END

输入:'a,b,c' 输出:一个 b c

【讨论】:

以上是关于将逗号分隔的字符串拆分为mysql中的行的主要内容,如果未能解决你的问题,请参考以下文章

将分隔字符串拆分为存储过程中的变量[重复]

如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?

将 pandas 中的一个单元格拆分为多行

将逗号分隔的字符串拆分为数组?

Redshift :- 易于将逗号分隔的字符串拆分为行

将逗号分隔的字符串拆分为 R 中定义的数量