MySQL拆分列值

时间:2019-03-28 22:34:03

标签: mysql sql search split comma

我的数据列分开。

1223,7990,8373,3892,7654,8908

是否存在任何将列拆分为0..N字符串(用逗号分隔)的MYSQL函数?

然后检查从列中拆分出来的vale是否在数组语句内-列值IN(7990)。

2 个答案:

答案 0 :(得分:1)

要将CSV字符串拆分为多个部分,以下是使用SUBSTRING_INDEX()的解决方案:

SELECT
    val,
    SUBSTRING_INDEX(SUBSTRING_INDEX(val,',',1), ',', -1) val1, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(val,',',2), ',', -1) val2, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(val,',',2), ',', -1) val3
FROM t;

这将为您提供前三场比赛。您可以在查询中自由添加更多列以捕获更多CSV部分。

Demo on DB Fiddle

| val                           | val1 | val2 | val3 |
| ----------------------------- | ---- | ---- | ---- |
| 1223,7990,8373,3892,7654,8908 | 1223 | 7990 | 7990 |

另一方面,如果您只想检查给定值是否是CSV字符串的一部分,则可以简单地使用FIND_IN_SET(),例如:

SELECT val FROM t WHERE FIND_IN_SET('1223', val);

答案 1 :(得分:1)

  

是否存在任何将列拆分为0..N的MYSQL函数   用逗号分隔的字符串?

将升级GMB答案,即使用数字生成器通过嵌套的SUBSTRING_INDEX()函数自动拆分字符串。

SELECT 
  DISTINCT
     t.val 
   , SUBSTRING_INDEX(SUBSTRING_INDEX(t.val, ',', number_generator.row_number),   ',', -1) parsed_val
FROM (
  SELECT 
   @row := @row + 1 AS row_number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row2  
  CROSS JOIN (
    SELECT @row := 0 
  ) AS init_user_params
) AS number_generator
CROSS JOIN 
 t

结果

| val                           | parsed_val |
| ----------------------------- | ---------- |
| 1223,7990,8373,3892,7654,8908 | 1223       |
| 1223,7990,8373,3892,7654,8908 | 7990       |
| 1223,7990,8373,3892,7654,8908 | 8373       |
| 1223,7990,8373,3892,7654,8908 | 3892       |
| 1223,7990,8373,3892,7654,8908 | 7654       |
| 1223,7990,8373,3892,7654,8908 | 8908       |

请参阅demo