【问题标题】:substring_index does not take exact prefixsubstring_index 不采用确切的前缀
【发布时间】:2019-04-13 09:03:10
【问题描述】:

我有一个包含字符串的表。其中一些以https:// 开头,一些以http:// 开头。我想提取以http:// 开头的那些(没有s)。请注意,我不想使用LIKE 语句,因为我处理此字符串的计划中存在另一个冲突。因此,如果我在mytable 中名为mycol 的列中有以下项目:

https://111.com/
https://www.222.com/en-gb/

我做这个查询:

SELECT `mytable`.`mycol`, substring_index(`mytable`.`mycol`,'http://',-1)

我仍然在结果中得到这些字符串:

https://111.com/
https://www.222.com/en-gb/

为什么?既然我的查询是在寻找 http:// 而不是 https://,为什么我会得到以 https:// 开头的结果?在这个简单的示例中,它不应该返回任何内容,因为没有以 http:// 开头的字符串

想提取字符串

【问题讨论】:

    标签: mysql select substring


    【解决方案1】:

    您可以添加检查分隔符:

    SELECT `mycol`,
       IF(instr(mycol,'http://') > 0, substring_index(`mytable`.`mycol`,'http://',-1),NULL)
    FROM mytable;
    

    db<>fiddle demo


    SUBSTRING_INDEX函数找不到delim字符串时,它将返回原始字符串而不是NULL

    SELECT substring_index('abc','.',-1)
    =>
    abc
    

    【讨论】:

      【解决方案2】:

      使用正则表达式。更简单。

      SELECT mycol FROM mytable WHERE mycol REGEXP '^http://.+';

      【讨论】:

      • REGEXT 据我所知返回真或假。我需要以 http:// 开头的字符串部分,但我需要没有 http:// 的部分(即子字符串)
      • 在 mysql 版本 8.0 中有 REGEXP_SUBSTR。可能有帮助
      【解决方案3】:

      我想提取那些以http://开头的

      如果您不想使用 LIKE,可以使用 left():

      select right(columnname, length(columnname) - 7) from tablename
      where left(columnname, 7) = 'http://'
      

      您不需要知道字符串的长度。
      您想要的只是提取第一个 7 个字符之后的字符串部分。
      这部分的长度是:

      length(columnname) - 7
      

      所以使用right()

      【讨论】:

      • 我需要了解这个例子中 sub_string 有什么问题?
      • 阅读:dev.mysql.com/doc/refman/8.0/en/…。我猜substring_index 在这种情况下不适合使用。
      • 我想提取 http:// 之后的部分(没有 http:// 的子字符串),这就是 LIKE% 不适合的原因。而且长度不固定。我有很多字符串。我只知道他们的开始,但不知道他们的长度
      • 因此您可以提取第一个 7 个字符之后的所有内容。请参阅我编辑的答案。
      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多