first commit
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
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 ;
|
||||
Reference in New Issue
Block a user