Преобразование значений с разделителями в список через запятую - PullRequest
1 голос
/ 04 апреля 2019

В моем веб-приложении (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;

1 Ответ

0 голосов
/ 04 апреля 2019

Согласно приведенному выше коду, мне удалось написать собственную функцию MySQL для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...