好吧,所以我有一个像这样设置字符串的列......
string/1984-Michael-Jackson-133298
string/1984-Steve-Van-Bure-392289
我试图从这个字符串中取出名字。如图所示,问题是有3个部分的名称,如#34; Steve Van Bure"。我知道如何使用SUBSTRING_INDEX获得中间两个单词,但我不确定如何确保包含3个单词。所以我认为最好的选择是取出第一个和最后一个选项,名字中间的是什么。
有关如何使用Mysql函数执行此操作的任何线索?感谢
答案 0 :(得分: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]
答案 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
函数,REVERSE
和LENGTH
函数结合使用。我们使用REVERSE
和LENGTH
来获取最后一个“ - ”的位置。
获取字符串的第一部分(年份)相对简单 - 我们使用SUBSTRING
函数,该函数将列名作为参数,包括起始位置和长度。起始位置是第一个“/”的位置加上1,因为我们实际上并不想要“/”(LOCATE("-",str)+1
)。长度是从第一个“/”到第一个“ - ”或SQL LOCATE("-",str)-LOCATE("/",str)-1
的距离。
现在让我们稍后再回到字符串的第二部分(名称)。对于字符串的第三部分(数字),神奇在于与REVERSE
一起使用的LENGTH
函数。我们最终想要找到最后一个“ - ”的位置,然后从最后一个“ - ”到字符串末尾获取子串。不幸的是,MySQL没有返回最后一个字符的函数。获取最后一个“ - ”位置的技巧是在反向字符串中获取“ - ”的位置,然后从字符串的长度中减去该位置。在SQL中,那是LENGTH(str) - LOCATE("-",REVERSE(str)) + 2
。
现在我们获得了获取中间部分(名称)所需的信息。我们再次使用SUBSTRING
函数将列名称,第一个“ - ”的位置和最后一个“ - ”的长度传递给它。就是这样!