簡體   English   中英

將定界值轉換為逗號分隔的列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM