1.1 MySQL判斷兩個字串是否有交集
阿新 • • 發佈:2018-12-09
1.1.1 設定log_bin_trust_function_creators
log_bin_trust_function_creators控制是否可以信任儲存函式建立者,不會建立寫入二進位制日誌引起不安全事件的儲存函式。如果設定為0(預設值),使用者不得建立或修改儲存函式,除非它們具有除CREATE ROUTINE或ALTER ROUTINE特權之外的SUPER許可權。 設定為0還強制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性宣告函式的限制。 如果變數設定為1,MySQL不會對建立儲存函式實施這些限制。 此變數也適用於觸發器的建立。
set global log_bin_trust_function_creators=TRUE;
1.1.2 建立函式
DROP FUNCTION IF EXISTS `INTE_ARRAY`; delimiter // -- 集合交集檢查函式 -- @param varchar(255) setA A 集合 如 "1,3,5,9" -- @param varchar(255) setB B 集合 如 "8,2,3,7" -- @return int(1) B 集合內單元在 A集合 記憶體在則返回 1 否則返回 0 CREATE FUNCTION `INTE_ARRAY` (setA varchar(255),setB varchar(255)) RETURNS int(1) BEGIN DECLARE idx INT DEFAULT 0 ; -- B 集合單元索引 DECLARE len INT DEFAULT 0;-- B 集合表示式長度 DECLARE llen INT DEFAULT 0;-- 最後檢查位置 DECLARE clen INT DEFAULT 0;-- 當前檢查位置 DECLARE tmpStr varchar(255);-- 臨時檢查資料集 DECLARE curt varchar(255);-- B 當前檢查的單元 SET len = LENGTH(setB); WHILE idx < len DO SET idx = idx + 1; SET tmpStr = SUBSTRING_INDEX(setB,",",idx); SET clen = LENGTH(tmpStr); -- 獲取當前 setB 中的單元 IF idx = 1 THEN SET curt = tmpStr; ELSE SET curt = SUBSTRING(setB,llen+2,clen-llen-1); END IF; -- 檢查是否存在於 setA 中 IF FIND_IN_SET(curt,setA) > 0 THEN RETURN 1; END IF; -- 當前檢查終點與上次檢查終點相同則跳出 IF clen <= llen THEN RETURN 0; END IF; SET llen = clen; END WHILE; RETURN 0; END; // delimiter ;
1.1.3 測試
測試1:
select INTE_ARRAY("1,5","1,2,3,4") as is_inte_array;
結果1:
測試2:
select INTE_ARRAY("12,5","1,2,3,4") as is_inte_array;
結果2: