将分隔值转换为逗号分隔列表

问题描述 投票:1回答:1

我的Webapp(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;
mysql sql
1个回答
0
投票

根据上面的代码,我设法编写自己的MySQL函数来执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.