使用REPLACE和SUBSTRING_INDEX在MySQL中拆分字符串

时间:2012-03-21 23:38:03

标签: mysql sql substring string-split

我需要分开这个:

a:6:{s:8:"address1";s:11:"2 Bourke St";s:8:"address2";s:13:"Woolloomooloo";s:4:"city";s:6:"Sydney";s:5:"state";s:3:"NSW";s:11:"postal_code";s:4:"2011";s:7:"country";s:9:"Australia";}

;提取字符串末尾附近找到的值2011。即使拔出s:4:"2011"也行不通。

我目前正在使用此代码:

REPLACE(SUBSTRING_INDEX(address, ';', 10), LENGTH(SUBSTRING_INDEX(address, ';', 10 -1)) + 1), ';', '')

我是从一个网站上得到的,它将其列为在MySQL中拆分字符串的解决方案......但它中存在语法错误。我尝试调试它,发现有一个)太多,但我无法弄清楚如何更改它以使其工作......我不知道如何分割字符串。

this solution ...

相比,这似乎过于复杂

有人可以提供帮助吗?解释它是如何工作的,或者替代解决方案也可以。

谢谢!

2 个答案:

答案 0 :(得分:3)

阅读SUBSTRING_INDEXREPLACE的文档,它会更清楚代码尝试做什么。

请注意SUBSTRING_INDEX(address,';',10)检索address的所有;,直至第{10}出现s:4:"2011",因此在您的情况下,从字符串的开头到REPLACE(string,from,to)。< / p>

fromto替换REPLACE的所有出现。看起来您尝试的代码试图将所有内容替换为第9个';'没有任何东西(通过s:4:"2011"),并且在第10个'之后也切掉一切';'。这将留下's:4:“2011”'。

您可以提取SUBSTRING_INDEX(address,';',-4)的一种方法是使用;,它返回从第4个s:4:"2011";s:7:"country";s:9:"Australia";}开始的所有内容。在您的情况下,那将是SUBSTRING_INDEX(...,';',1)

然后,在此结果字符串上使用;,以便在s:4:"2011"第一次出现之前获取所有内容,即SUBSTRING_INDEX(SUBSTRING_INDEX(address,';',-4),';',1)

总结:

{{1}}

我确信还有其他方法可以做到。

答案 1 :(得分:0)

这应该这样做 -

SET @a := 'a:6:{s:8:"address1";s:11:"2 Bourke St";s:8:"address2";s:13:"Woolloomooloo";s:4:"city";s:6:"Sydney";s:5:"state";s:3:"NSW";s:11:"postal_code";s:4:"2011";s:7:"country";s:9:"Australia";}';
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@a, ';', -4), ';', 1);