我的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;
答案 0 :(得分:0)
按照上面的代码,我设法编写了自己的MySQL函数来完成此操作。