Mysql删除字符串的第一个和最后一个部分 - 像功能一样爆炸?

时间:2017-01-16 21:52:23

标签: mysql string function

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

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

我试图从这个字符串中取出名字。如图所示,问题是有3个部分的名称,如#34; Steve Van Bure"。我知道如何使用SUBSTRING_INDEX获得中间两个单词,但我不确定如何确保包含3个单词。所以我认为最好的选择是取出第一个和最后一个选项,名字中间的是什么。

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

2 个答案:

答案 0 :(得分:1)

使用SUBSTRING_INDEXREPLACETRIM的组合 删除第一个-(非包含)的所有字符以及从最后-(非包含)到字符串末尾的所有字符。从那里只删除剩余字符串开头和结尾的剩余-

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

答案 1 :(得分:0)

您可以使用以下代码,其中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函数,REVERSELENGTH函数结合使用。我们使用REVERSELENGTH来获取最后一个“ - ”的位置。

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

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

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