【问题标题】:Can Mysql Split a column?Mysql可以拆分列吗?
【发布时间】: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 完成该处理工作。 谢谢!

【问题讨论】:

    标签: mysql split


    【解决方案1】:

    使用

    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
    

    【讨论】:

    • 我不得不使用 substring_index(substring_index(column,',',-1),',',1) 来获得第二个值。始终使用 -2 给了我第一个值。不过效果很好。 :)
    • 当您添加更多行时,此答案中的索引会有些混乱。
    • 很好的解决方案。工作。谢谢!
    【解决方案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 中列的名称。

    【讨论】:

    • 这是一个更清晰的答案,因为它的索引更有条理。
    【解决方案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 Docs on Pattern Matching

      【讨论】:

        【解决方案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) 只返回最后一个
          • 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; 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-09-01
              • 1970-01-01
              • 2010-10-03
              • 2014-06-01
              • 1970-01-01
              • 2011-09-10
              相关资源
              最近更新 更多