Mysql可以拆分列吗?

时间:2009-07-08 07:53:03

标签: mysql split

我有一个以逗号分隔数据的列:

1,2,3
3,2,1
4,5,6
5,5,5

我正在尝试运行一个可以单独查询CSV字符串的每个值的搜索。

0<first<5   and  1<second<3  and  2<third<4 

我知道我可以返回所有查询并自行拆分并自行比较。 我很好奇是否有办法这样做,所以mysql做了处理工作。 谢谢!

6 个答案:

答案 0 :(得分:45)

使用

substring_index(`column`,',',1) ==> first value
substring_index(substring_index(`column`,',',-2),',',1)=> second value
substring_index(substring_index(`column`,',',-1),',',1)=> third value

在你的where子句中。

SELECT * FROM `table`
WHERE 
substring_index(`column`,',',1)<0 
AND
substring_index(`column`,',',1)>5

答案 1 :(得分:7)

通常substring_index可以满足您的需求:

mysql> select substring_index("foo@gmail.com","@",-1);
+-----------------------------------------+
| substring_index("foo@gmail.com","@",-1) |
+-----------------------------------------+
| gmail.com                               |
+-----------------------------------------+
1 row in set (0.00 sec)

答案 2 :(得分:4)

您可以使用MySQL REGEXP或LIKE获得所需内容。

请参阅MySQL Docs on Pattern Matching

答案 3 :(得分:1)

作为对此的补充,我有以下形式的字符串: 有些话303

我想从字符串的尾部拆分数字部分。 这似乎指出了一个可能的解决方案:

http://lists.mysql.com/mysql/222421

问题是,你只得到答案“是的,它匹配”,而不是正则表达式匹配的起始索引。

答案 4 :(得分:1)

以下是我在相关问题上发布的另一个变体。 REGEX检查您是否超出范围是有用的,因此对于表列,您可以将其放在where子句中。

SET @Array = 'one,two,three,four';
SET @ArrayIndex = 2;
SELECT CASE 
    WHEN @Array REGEXP CONCAT('((,).*){',@ArrayIndex,'}') 
    THEN SUBSTRING_INDEX(SUBSTRING_INDEX(@Array,',',@ArrayIndex+1),',',-1) 
    ELSE NULL
END AS Result;
  • SUBSTRING_INDEX(string, delim, n)返回第一个
  • SUBSTRING_INDEX(string, delim, -1)返回最后一个
  • REGEXP '((delim).*){n}'检查是否有n个分隔符(即你在界限内)

答案 5 :(得分:0)

它正在运作..

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(
SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(col,'1', 1), '2', 1), '3', 1), '4', 1), '5', 1), '6', 1)
, '7', 1), '8', 1), '9', 1), '0', 1) as new_col  
FROM table_name group by new_col;