2012-06-29 3 views
0

мне нужно сделать следующее и я борюсь с синтаксисом:Заменить значение столбца в таблице, используя регулярные выражения в MySQL

У меня есть таблица под названием «туЬаОй» и столбец с названием «MyColumn» (строка).

В моей колонке значение представляет собой построенное значение - например, одно из значений: «first: 10: second: 18: third: 31». Значения в mycolumn все используют один и тот же шаблон, только идентификаторы/числа различны.

Мне нужно изменить значение 18 (в данном конкретном случае) на значение из другой таблицы таблиц. Конечный результат для этого значения столбца должен быть «первым: 10: второй: 22: третий: 31», потому что я заменил 18 на 22. Я получил 22 из другой таблицы, используя 18 в качестве значения поиска.

Так в идеале я бы следующее:

UPDATE mytable 
SET mycolumn = [some regex function to find the number between 'second:' and ":third" - 
let's call that oldkey - and replace it with other id from another table - 
(select otherid from tableb where id = oldkey)]. 

Я знаю, что MySQL имеет функцию REPLACE, но это не поймите меня достаточно далеко.

+0

Почему вы хранящие данные в этих разделителями строк? Разве вы не можете разбить их на свои колонны? – eggyal

+0

Да, я согласен, но я имею дело с некоторым наследием в базе данных. –

ответ

2

Вы можете создать свою собственную функцию. Я боюсь REGEX, поэтому я использую SUBSTRING и SUBSTRING_INDEX.

CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT) 
RETURNS VARCHAR(255) 
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos), 
    LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1), 
    delim, ''); 

SPLIT_STRING('first:10:second:18:third:31', ':', 4) 

возвращается 18

На основании этого ответа:

Equivalent of explode() to work with strings in MySQL

+0

Спасибо. Я решил пойти с вашим ответом и использовать его с функцией CONCAT в mysql, чтобы воссоздать эту составную строку. –

1

Вы хотите что-то вроде этого, где она соответствует группе:

WHERE REGEXP 'second:([0-9]*):third' 

Однако MySQL не имеет функции регулярных выражений замены, поэтому вы должны использовать определяемые пользователем функции:

REGEXP_REPLACE?(text, pattern, replace [,position [,occurence [,return_end [,mode]]]) 

определяемая пользователем функция доступна здесь:

http://www.mysqludf.org/lib_mysqludf_preg/

+0

Я думаю, что это приближает меня (может быть?), Но на самом деле я хочу найти эти цифры и заменить их. Что-то вроде этого простого примера (где я просто заменяю число на 16 ... но это не работает, потому что REGEX просто возвращает 1 или 0 - true или false для соответствия): SELECT REPLACE (mycolumn, mycolumn REGEXP 'second : ([0-9] *): третий ',' 16 ') из обсуждений; –

+0

@ArthurFrankel Здесь вы идете, https://launchpad.net/mysql-udf-regexp. Это пользовательская функция замены REGEX. –

+0

Вот еще один, который кажется более простым в установке: http://www.mysqludf.org/lib_mysqludf_preg/ –

1

Проблема с MySQL заключается в том, что ее REGEX-аромат очень ограничен и не поддерживает обратные ссылки или замену регулярных выражений, что в значительной степени не позволяет заменить значение, как вы хотите, только с MySQL.

Я знаю, что это означает, что вы получаете скорость, но можете захотеть выбрать строку, в которой вы хотите, своим идентификатором или, тем не менее, вы ее выберете, измените значение с помощью PHP или любого другого языка, с которым вы взаимодействуете с MySQL, и поставьте его назад с запросом UPDATE.

Вообще говоря, REGEX на языках программирования намного более эффективен.

Если вы держите эти запросы в тонких и быстрых точках, вы не должны слишком сильно набирать скорость (возможно, незначительно).

Кроме того, здесь приведена документация о том, что может сделать REGEX CAN. http://dev.mysql.com/doc/refman/5.1/en/regexp.html

Приветствие

EDIT:

Честно говоря, комментарий eggyal делает намного больше смысла для вашей ситуации (простых Int значений). Просто разбить их на столбцы, нет никаких оснований для доступа к ним, как это вообще.

+0

Это часть наследия, но на самом деле значение этого столбца используется как ключ к внешней системе, поэтому сохранение его как одного поля несколько лучше (производительность). Спасибо за Ваш ответ. –

Смежные вопросы