[英]Converting delimited values into a comma separated list
我的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函數來執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.