我有一个以逗号分隔数据的列:
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做了处理工作。 谢谢!
答案 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获得所需内容。
答案 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;