可以Mysql分割一列吗?
我有一列用逗号分隔的数据:
1,2,3 3,2,1 4,5,6 5,5,5
我试图运行一个search,将单独查询每个CSVstring的值。
0<first<5 and 1<second<3 and 2<third<4
我得到,我可以返回所有的查询和自己分裂,并自己比较。 我很好奇,如果有办法做到这一点,所以MySQL的处理工作。 谢谢!
使用
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
它似乎工作:
substring_index(substring_index(context,',',1),',',-1))
substring_index(substring_index(context,',',2),',',-1))
substring_index(substring_index(context,',',3),',',-1))
substring_index(substring_index(context,',',4),',',-1))
这意味着第一个值,第二个,第三个等等
说明:
inner substring_index
返回逗号分隔的前n个值。 所以如果你的原始string是“34,7,23,89”, substring_index( context,',', 3)
返回“34,7,23”。
外部substring_index
接受内部substring_index
返回的值, -1
允许你取最后一个值。 所以你从“34,7,23”得到“23”。
如果指定-2
,而不是-1
,则会得到“7,23”,因为它取最后两个值。
例:
select * from MyTable where substring_index(substring_index(prices,',',1),',',-1)=3382;
这里, prices
是MyTable
列的名称。
通常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)
你可以通过使用MySQL REGEXP或者LIKE来得到你想要的。
查看模式匹配的MySQL文档
作为这个的附录,我有一些forms的string:有些字是303
我想从string的尾部分开数字部分。 这似乎指向一个可能的解决scheme:
http://lists.mysql.com/mysql/222421
然而问题是,你只能得到答案“是的,它匹配”,而不是正则expression式匹配的开始索引。
这是我发布在相关问题上的另一个变体。 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)
返回第一个n -
SUBSTRING_INDEX(string, delim, -1)
只返回最后一个 -
REGEXP '((delim).*){n}'
检查是否有n个分隔符(即你在界限内)
这是工作..
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;