将定界值转换为逗号分隔的列表

时间:2019-04-04 01:02:39

标签: mysql sql

我的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;

1 个答案:

答案 0 :(得分:0)

按照上面的代码,我设法编写了自己的MySQL函数来完成此操作。