我的数据列分开。
1223,7990,8373,3892,7654,8908
是否存在任何将列拆分为0..N字符串(用逗号分隔)的MYSQL函数?
然后检查从列中拆分出来的vale是否在数组语句内-列值IN(7990)。
答案 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部分。
| 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