【发布时间】:2010-11-08 23:04:31
【问题描述】:
我有一列包含逗号分隔的数据:
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 完成该处理工作。 谢谢!
【问题讨论】:
我有一列包含逗号分隔的数据:
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 完成该处理工作。 谢谢!
【问题讨论】:
使用
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
【讨论】:
column,',',-1),',',1) 来获得第二个值。始终使用 -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”。
如果您指定-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 获得您想要的。
【讨论】:
作为补充,我有以下形式的字符串: 一些话 303
我想从字符串尾部分离出数字部分。 这似乎指向了一个可能的解决方案:
http://lists.mysql.com/mysql/222421
但是,问题是您只能得到“是的,它匹配”的答案,而不是正则表达式匹配的起始索引。
【讨论】:
这是我在相关问题上发布的另一个变体。 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) 返回第一个 nSUBSTRING_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;
【讨论】: