1

我需要拆分这个:

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 中拆分字符串的解决方案的网站上获得的……但其中有语法错误。我尝试调试它,发现有一个太多)但我无法弄清楚如何更改它以使其工作......我对这应该如何拆分字符串缺乏了解。

与此解决方案相比,它似乎过于复杂......

任何人都可以提供帮助吗?对其工作原理的解释会很好,或者替代解决方案也可以。

谢谢!

4

2 回答 2

3

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

请注意,最多SUBSTRING_INDEX(address,';',10)检索 10 次出现的所有内容,因此在您的情况下,从字符串的开头到.address;s:4:"2011"

REPLACE(string,from,to)用 替换所有出现fromto。看起来您尝试的代码正在尝试替换所有内容,直到第 9 个 ';' 什么都没有(通过REPLACE),并且在第 10 个 ';' 之后也切断了所有内容。这将留下 's:4:"2011"'。

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

然后,SUBSTRING_INDEX(...,';',1)在这个结果字符串上使用第一次出现;,之前的所有内容s:4:"2011"

总之:

SUBSTRING_INDEX(SUBSTRING_INDEX(address,';',-4),';',1)

我敢肯定还有其他方法可以做到这一点。

于 2012-03-21T23:59:49.227 回答
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);
于 2012-03-21T23:56:32.440 回答