DELIMITER // CREATE OR REPLACE FUNCTION `gf_trans_json_v7` ( p_source TEXT, p_actions VARCHAR(1) -- C(reate) 或 U(pdate) ) /* function : 將 amis 傳入的字串, 轉為標準 json 格式後回傳給 orm_api(配合 mariadb) 修改自 gf_trans_json(已不使用) description: 呼叫範例 SELECT gf_trans_json_v7('xxxx', 'C'); build date : 2021/09/26 modify history item who date modify docs ==== ========== ========== ================================================ 1 michael 2021/09/26 新增 2 [改寫者] 2023/11/15 改寫為 MariaDB 版本並最佳化 */ RETURNS TEXT DETERMINISTIC BEGIN DECLARE v_max INT; DECLARE v_now INT; DECLARE v_rets TEXT; DECLARE v_rows_pos INT; DECLARE v_rows_diff_pos INT; IF p_actions = 'C' THEN SET v_rets = SUBSTRING(p_source, 2, CHAR_LENGTH(p_source) - 1); -- step1: 先移除數字鍵 (最佳化:使用迴圈而非逐次檢查) SET v_now = 0; WHILE v_now <= 1000 DO IF INSTR(v_rets, CONCAT('"', v_now, '":')) > 0 THEN SET v_rets = REPLACE(v_rets, CONCAT('"', v_now, '":'), ''); END IF; SET v_now = v_now + 1; END WHILE; -- 移除結尾多餘的 } 字符 IF RIGHT(v_rets, 2) = '}}' THEN SET v_rets = LEFT(v_rets, CHAR_LENGTH(v_rets) - 1); END IF; SET v_rets = CONCAT('{[', v_rets, ']}'); ELSEIF p_actions = 'U' THEN -- 找出 rows 和 rowsDiff 的位置 SET v_rows_pos = INSTR(p_source, '"rows":'); SET v_rows_diff_pos = INSTR(p_source, '"rowsDiff":'); -- 擷取 rows 內容並格式化 SET v_rets = SUBSTRING(p_source, 1, v_rows_diff_pos - 3); SET v_rets = SUBSTRING(v_rets, v_rows_pos + 8, CHAR_LENGTH(v_rets)); SET v_rets = CONCAT('{[', v_rets, ']}'); END IF; RETURN v_rets; END // DELIMITER ;