我有一个用逗号分隔数据的列:
1,2,3
3,2,1
4,5,6
5,5,5


我知道我可以返回所有查询并将其拆分并自己进行比较。
我很好奇是否有一种方法可以使mysql做到这一点处理工作。
谢谢!

#1 楼

在您的where子句中使用

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




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


评论


我必须使用substring_index(substring_index(column,',',-1),',',1)来获取第二个值。始终使用-2给我第一个价值。不过效果很好。 :)

–本杰明·阿曼
13年1月10日,0:28



当您添加更多行时,此答案中的索引会有些混乱。

–汤姆
17年10月10日在10:03

很好的解决方案。工作了。谢谢!

– Flavio
19年7月16日在12:17

#2 楼

似乎有效:

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)


它表示第一个值,第二个,第三个值,等等。

说明:

内部substring_index返回以逗号分隔的前n个值。因此,如果原始字符串为“ 34,7,23,89”,则substring_index( context,',', 3)返回“ 34,7,23”。
外部substring_index采用内部substring_index返回的值,而-1允许您采用最后一个值。因此,您会从“ 34,7,23”中获得“ 23”。
如果您指定-1,则会代替-2,而会获得“ 7,23”,因为它采用了最后两个值。

示例:

select * from MyTable where substring_index(substring_index(prices,',',1),',',-1)=3382;


这里,pricesMyTable中的列的名称。

评论


鉴于索引的结构更合理,这是一个更清晰的答案。

–汤姆
17年11月10日在10:04

#3 楼

通常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)


#4 楼

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

请参阅有关模式匹配的MySQL文档

#5 楼

作为补充,我有以下形式的字符串:
一些单词303

,我想从字符串的尾部分离出数字部分。
这似乎指向可能的解决方案:

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

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

#6 楼

这是我在相关问题上发布的另一个变体。 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)返回最后一个n
REGEXP '((delim).*){n}'检查是否有n个定界符(即,您在边界内)


#7 楼

正在工作..

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;