DELIMITER // CREATE OR REPLACE FUNCTION gf_split( p_source TEXT, p_split VARCHAR(2) ) RETURNS TEXT /* function : 將傳入的字串, 依 p_split 切割為多筆資料, 傳回 table description: 呼叫範例: SELECT col FROM JSON_TABLE(gf_split('R,G,B',','), '$[*]' COLUMNS(col VARCHAR(600) PATH '$.col')) t; SELECT col FROM JSON_TABLE(gf_split('R,G,B',','), '$[*]' COLUMNS(rowid int PATH '$.rowid', col VARCHAR(600) PATH '$.col')) t WHERE rowid = 1; 必須要有 CREATE TABLE _split( guid varchar(100), rowid INT, col varchar(600) ); https://www.sqlines.com/sql-server-to-mariadb/returns_table build date : 2023/11/20 modify history item who date modify docs ==== ========== ========== ================================================ 1 michael 2011/09/08 新增 2 Michael 2025/07/11 改寫為MariaDB版本並優化 */ BEGIN DECLARE v_pos INT; DECLARE v_cnt INT; DECLARE v_length INT; DECLARE v_temp TEXT; DECLARE p_uuid VARCHAR(100); DECLARE data TEXT; SET v_length = LENGTH(p_split); SET v_temp = p_source; SET p_uuid = UUID(); SET v_cnt = 1; -- 循環處理分割 WHILE LOCATE(p_split, v_temp) > 0 DO SET v_pos = LOCATE(p_split, v_temp); INSERT INTO _split (guid, rowid, col) VALUES (p_uuid, v_cnt, SUBSTRING(v_temp, 1, v_pos - 1)); SET v_temp = SUBSTRING(v_temp, v_pos + v_length); SET v_cnt = v_cnt + 1; END WHILE; -- 添加最後一部分 IF LENGTH(v_temp) > 0 THEN INSERT INTO _split(guid, rowid, col) VALUES (p_uuid, v_cnt, v_temp); END IF; SELECT JSON_ARRAYAGG(JSON_OBJECT('col', col)) INTO data FROM ( SELECT col FROM _split WHERE guid = p_uuid ) data; -- del temp data delete from _split WHERE guid = p_uuid; RETURN data; END // DELIMITER ;