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给我第一个值。不过效果很好。:)当您添加更多行时,这个答案中的索引会有点混乱。这是一个很好的解决方案。工作。谢谢这是一个更清晰的答案,因为它的指数更加结构化。