В моем веб-приложении (PHP / jQuery / MySQL) есть функции, которые позволяют мне отправлять своим клиентам приятно отформатированные html-уведомления по электронной почте на основании определенных событий.Код работает хорошо и объединяет данные из моей базы данных в поля формы, хотя мне нужно улучшить его, чтобы иметь возможность предоставлять обогащенные / локализованные / переформатированные данные при некоторых обстоятельствах.
Например: - укажите значения даты / времени всобственный часовой пояс пользователя - укажите денежные значения, отформатированные в соответствии с языковым стандартом пользователя
. Это требует от меня еще одного прохода содержимого электронной почты, чтобы определить, остаются ли какие-либо поля незаполненными, прежде чем отправлять письмо пользователю и, если да,отформатируйте эти значения полей перед отправкой электронного письма.Поэтому я хочу извлечь список всех имен полей с разделителями из значения поля таблицы и вернуть этот список в форме с разделителями-запятыми.
- Я уже могу подсчитать, сколько раз появляется разделитель
- Я также могу найти положение первого разделителя
- Похоже, было бы легко разделить значения, если бы я использовал одни и те же открывающие и закрывающие разделители, но потому что у меня уже есть много шаблонов электронной почты, которые уже используютсяв данный момент это не жизнеспособно
У меня пока нет кода для этого.Я просто пытаюсь избежать написания своей собственной функции MySQL для этого, используя существующие функции MySQL, если они способны на это.
Я пытался использовать различные комбинации SUBSTRING, SUBSTRING_INDEX, LOCATE.
Итак, что мне нужно сделать, это примерно так:
SELECT msg_id, values_found_between(msg_content,"<",">") AS comma_delimited_list;
Так, например, с исходными данными ...
msg_id | msg_content
-------+------------
1 | The quick brown <fox> jumps over the lazy <dog>
2 | The quick brown fox jumps over the lazy dog
я могуполучить результирующий набор записей, такой как это:
msg_id | comma_seperated_list
-------+------------
1 | fox,dog
Хорошо, у меня была трещина, и это, кажется, работает хорошо:
CREATE FUNCTION db.`FN_find_values_between`(`in_haystack` VARCHAR(10000), `in_opening_delimiter` VARCHAR(1),`in_closing_delimiter` VARCHAR(1)) RETURNS varchar(1000) CHARSET utf8
BEGIN
DECLARE numFoundOpen INT DEFAULT 0;
DECLARE numFoundClose INT DEFAULT 0;
DECLARE numFoundTarget INT DEFAULT 0;
DECLARE numCurrentIndex INT DEFAULT 0;
DECLARE strOutput VARCHAR(1000) DEFAULT "";
DECLARE numSearchFromPos INT DEFAULT 1;
DECLARE numCurrentCharPosStart INT DEFAULT 1;
DECLARE numCurrentCharPosEnd INT DEFAULT 1;
DECLARE strCurrentFieldname VARCHAR(50) DEFAULT "";
DECLARE numLength INT DEFAULT 0;
SET numFoundOpen=
(SELECT
ROUND ((LENGTH(in_haystack)- LENGTH( REPLACE (in_haystack, in_opening_delimiter, ""))) / LENGTH(in_opening_delimiter)));
SET numFoundClose=
(SELECT
ROUND ((LENGTH(in_haystack)- LENGTH( REPLACE (in_haystack, in_closing_delimiter, ""))) / LENGTH(in_closing_delimiter)));
IF (numFoundOpen=numFoundClose) THEN
SET numFoundTarget=numFoundOpen;
END IF;
WHILE numCurrentIndex < numFoundTarget DO
SET numCurrentIndex=numCurrentIndex+1;
SET numCurrentCharPosStart = LOCATE(in_opening_delimiter, in_haystack, numSearchFromPos);
SET numCurrentCharPosEnd = LOCATE(in_closing_delimiter, in_haystack, numSearchFromPos);
SET numLength=1+(numCurrentCharPosEnd-numCurrentCharPosStart);
SET strCurrentFieldname=SUBSTRING(in_haystack,numCurrentCharPosStart,numLength);
SET strOutput=CONCAT(strOutput,strCurrentFieldname,",");
SET strCurrentFieldname="";
SET numSearchFromPos=numCurrentCharPosEnd+1;
END WHILE;
IF (strOutput <> "") THEN
SET strOutput=LEFT(strOutput,LENGTH(strOutput)-1);
END IF;
RETURN strOutput;
END;