Mysql可以拆分列吗?
我有一列包含逗号分隔的数据:Mysql可以拆分列吗?,mysql,split,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 0您可以通过使用MySQL REGEXP或类似工具获得所需内容 请参见作为本文件的附录,我有以下格式的字符串: 一些单词303 我想把数字部分从字符串的尾部分离出来。 这似乎指向了一个可能的解决方案: 然而,问题是,您只得到“是
1,2,3
3,2,1
4,5,6
5,5,5
我正在尝试运行一个搜索,该搜索将分别查询CSV字符串的每个值
0<first<5 and 1<second<3 and 2<third<4
0您可以通过使用MySQL REGEXP或类似工具获得所需内容
请参见作为本文件的附录,我有以下格式的字符串:
一些单词303
我想把数字部分从字符串的尾部分离出来。
这似乎指向了一个可能的解决方案:
然而,问题是,您只得到“是的,它匹配”的答案,而不是regexp匹配的开始索引。使用
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
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;
从`表中选择*`
哪里
子字符串_索引(`column`,'',',1)5
它正在工作
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;
这是我在相关问题上发布的另一个变体。检查是否超出范围的REGEX
检查非常有用,因此对于表列,可以将其放在where子句中
SELECT * FROM `table`
WHERE
substring_index(`column`,',',1)<0
AND
substring_index(`column`,',',1)>5
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\u索引(string,delim,n)
返回第一个n
SUBSTRING\u索引(string,delim,-1)
仅返回最后一个
REGEXP'((delim.*){n}'
检查是否有n个分隔符(即您在边界内)
通常做你想做的事:
mysql> select substring_index("foo@gmail.com","@",-1);
+-----------------------------------------+
| substring_index("foo@gmail.com","@",-1) |
+-----------------------------------------+
| gmail.com |
+-----------------------------------------+
1 row in set (0.00 sec)
这似乎有效:
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)
它表示第一个值、第二个值、第三个值等
说明:
内部子字符串索引返回逗号分隔的前n个值。因此,如果您的原始字符串是“34,7,23,89”,substring\u index(context,,,,,,,,,,3)
返回“34,7,23”。
外部子字符串索引
获取内部子字符串索引
返回的值,-1
允许您获取最后一个值。从“34,7,23”中可以得到“23”。
如果指定-2
,将得到“7,23”,而不是-1
,因为它使用了最后两个值
例子:
这里,prices
是MyTable
中的一列的名称,我必须使用substring\u index(substring\u index(column
,',',-1),',','1)来获取第二个值。始终使用-2给我第一个值。不过效果很好。:)当您添加更多行时,这个答案中的索引会有点混乱。这是一个很好的解决方案。工作。谢谢这是一个更清晰的答案,因为它的指数更加结构化。