【问题标题】:Mysql Remove First and Last Part of a String - Explode Like Function?Mysql删除字符串的第一部分和最后一部分 - 像函数一样爆炸?
【发布时间】:2017-05-31 20:02:07
【问题描述】:

好的,所以我有一列有这样设置的字符串...

string/1984-Michael-Jackson-133298
string/1984-Steve-Van-Bure-392289

我正在尝试从该字符串中提取名称。如图所示,问题是有 3 个部分的名称,例如“Steve Van Bure”。我知道如何使用 SUBSTRING_INDEX 来获取中间两个词,但我不确定如何确保包含 3。所以我认为最好的选择是去掉第一个和最后一个选项,不管是什么中间是名字。

有关如何使用 Mysql 函数执行此操作的任何线索?谢谢

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/986826/…
  • 删除第一个破折号之前的所有内容以及最后一个破折号之后的所有内容。无论有多少破折号,还剩下什么? (假设第一组和最后一组不能有多个破折号)
  • 这就是问题所在。如何删除第一个破折号之前的所有内容以及最后一个破折号之后的所有内容?
  • 看看SUBSTRING_INDEX()函数。
  • 我看过了。

标签: mysql string function


【解决方案1】:

使用SUBSTRING_INDEX、REPLACE 和TRIM 的组合 删除直到第一个-(不包括)的所有字符以及从最后一个-(不包括)到字符串末尾的所有字符。从那里删除剩余字符串开头和结尾的剩余-。

SELECT TRIM(BOTH '-' FROM REPLACE(REPLACE([YOUR FIELD], SUBSTRING_INDEX([YOUR FIELD], '-', 1), ''), SUBSTRING_INDEX([YOUR FIELD], '-', -1), '')) FROM [your table]

【讨论】:

    【解决方案2】:

    您可以使用以下代码,其中str 是列名,tablename 是表名。如果您只是想梳理出字符串的名称部分,那么只需使用标记为(方便)名称的 SELECT 子句部分:

    SELECT SUBSTRING(str,LOCATE("/",str)+1,LOCATE("-",str)-LOCATE("/",str)-1) AS year, 
    SUBSTRING(str,LOCATE("-",str)+1, LENGTH(str) - LOCATE("-",REVERSE(str)) - LOCATE("-",str)) AS name,
    SUBSTRING(str,LENGTH(str) - LOCATE("-",REVERSE(str)) + 2) as number
    FROM tablename;
    

    说明

    与您的标准通用编程语言相比,MySQL 的内置字符串操作函数集非常有限,但这可能是因为在大多数情况下,良好的表结构不需要这些函数。

    无论如何,有多种方法可以实现您的目标。一种方法是将SUBSTRING 函数与LOCATE 函数、REVERSE 和LENGTH 函数结合使用。我们使用REVERSE 和LENGTH 来获取最后一个“-”的位置。

    获取字符串的第一部分(年份)相对简单——我们使用SUBSTRING 函数,它的参数是列名、起始位置和长度。起始位置是第一个“/”的位置加上 1,因为我们实际上并不想要“/”(LOCATE("-",str)+1)。长度是从第一个“/”到第一个“-”的距离或在 SQL 中LOCATE("-",str)-LOCATE("/",str)-1。

    现在让我们稍后再回到字符串的第二部分(名称)。对于字符串的第三部分(数字),神奇之处在于与LENGTH 结合使用的REVERSE 函数。我们最终要找到最后一个“-”的位置,然后得到从最后一个“-”到字符串末尾的子串。不幸的是,MySQL 没有返回最后一次出现的字符的函数。获取最后一个“-”位置的技巧是在反转字符串中获取“-”的位置,然后从字符串的长度中减去它。在 SQL 中,这是LENGTH(str) - LOCATE("-",REVERSE(str)) + 2。

    现在我们有了获取中间部分(名称)所需的信息。我们再次使用SUBSTRING 函数向它传递列名、第一个“-”的位置以及直到最后一个“-”的长度。就是这样!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-13
      • 2018-12-07
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      相关资源
      最近更新 更多