Разделение строк в MySQL с использованием REPLACE и SUBSTRING_INDEX - PullRequest
1 голос
/ 22 марта 2012

Мне нужно разделить это:

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 ... но в нем есть синтаксические ошибки.Я попытался отладить его и обнаружил, что есть слишком много ), но я не смог выяснить, как изменить его, чтобы заставить его работать ... У меня нет понимания того, как это должно разбивать строки.

Это кажется слишком сложным по сравнению с этим решением ...

Может ли кто-нибудь оказать помощь?Было бы здорово объяснить, как это работает, или подойдет альтернативное решение.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Прочтите документацию для SUBSTRING_INDEX и REPLACE, и вам будет понятнее, что код пытается сделать.

Обратите внимание, что SUBSTRING_INDEX(address,';',10) извлекает все address вплоть до 10-го вхождения ;, поэтому в вашем случае от начала строки до s:4:"2011".

REPLACE(string,from,to) заменяет все вхождения fromс to.Похоже, что код, который вы пробовали, пытается заменить все до 9-го ';'ни с чем (через REPLACE), а также отрезать все после 10 ';'.Это оставило бы «: 4:« 2011 »».

Один из способов извлечь s:4:"2011" - это использовать SUBSTRING_INDEX(address,';',-4), который возвращает все с 4-го по ; и далее.В вашем случае это будет s:4:"2011";s:7:"country";s:9:"Australia";}.

Затем используйте SUBSTRING_INDEX(...,';',1) в этой результирующей строке, чтобы получить все до 1-го вхождения ;, равного s:4:"2011".

В итоге:

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

Я уверен, что есть и другие способы сделать это.

0 голосов
/ 22 марта 2012

Это должно сделать это -

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);
...