- 工作需求
今天工作的時候遇到一個功能需求,就是資料庫中儲存有一個字元串字段,用分号隔開的多個字元串,現在要傳入一個參數,這個參數也是用分隔符分開的多個字元串,要判斷資料庫中的字段中分号分割的任意一個字元串是否在傳入的參數分隔符分開的任意字元串中存在,舉個栗:
資料庫存入的字段: abc,12h,ghi
傳入的參數: 234;2h;gh;abc
這個時候傳回的值應該是 true,當然了,我的結果是不但傳回是否存在,還傳回在傳入參數的下标數,結果是11,
原因是傳入參數字元串的第11位才是資料庫中字段切分後的存在字元串。如果沒有找到就傳回0。
- 測試結果截圖:
- 資料庫函數源碼:
BEGIN
-- 作者: chuck_home_123_com
-- 時間:2018年3月28日
-- 參數: pSrc 【源字元串】
-- pOrderSrc 【源字元串】的【分隔符】
-- pStrIsExist 【需要判斷的字元串】
-- pOrderExist 【需要判斷的字元串】的【分隔符】
-- 功能: 判斷源字元串【pSrc】中以【pOrderSrc】分割的字元串集中
-- 是否包含字元串【pStrIsExist】中以【pOrderExist】分割的任意字元串
-- 傳回值:是否存在 【0】--不存在【false】 【>0】--存在【true】(可以直接用if判斷) IF 0 FALSE IF 1 TRUE
--
DECLARE srcCount INT;
DECLARE tempCount INT;
DECLARE resultValue INT;
-- 計算總共可以切分成幾段
SET srcCount = (1+(length(pSrc) - length(replace(pSrc,pOrderSrc,''))));
SET tempCount = 1;
SET resultValue = 0;
-- 判斷是否以分隔符開頭
IF(LEFT(pStrIsExist,(SELECT LENGTH(pOrderExist)))<> pOrderExist) THEN
SET pStrIsExist = concat(pOrderExist,pStrIsExist);
END IF;
-- 判斷是否以分隔符結尾
IF(RIGHT(pStrIsExist,(SELECT LENGTH(pOrderExist)))<> pOrderExist) THEN
SET pStrIsExist = concat(pStrIsExist,pOrderExist);
END IF;
WHILE ((tempCount < srcCount) and (resultValue = 0)) DO
-- 判斷的時候需要切割其中一個字元串
-- 然後拿出這個字元串兩端加上【需要判斷的字元串】的【分隔符】
-- 需要先判斷pStrIsExist【需要判斷的字元串】是否以pOrderExist【需要判斷的字元串】的【分隔符】開頭和結尾
-- 如果不是需要先加上
SET resultValue = (
SELECT locate(
(SELECT (
concat(
pOrderExist
-- 擷取第tempCount個切分的字元串
,REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(pSrc,pOrderSrc,tempCount)),pOrderSrc,1))
,pOrderExist)
)
)
,pStrIsExist
)
);
SET tempCount=tempCount+1;
END WHILE;
RETURN resultValue;
END
總結
其中用到了一些mysql的函數如下:
length(str) 求字元串的長度
mysql-> select length('mysql');
-> 5
left(str,len)
傳回字元串str的左端len個字元
mysql-> select left('mysql', 3);
-> 'mys'
right(str,len)
傳回字元串str的右端len個字元
mysql-> select right('mysql', 3);
-> 'sql'
reverse(str)
颠倒字元串str的字元順序并傳回
mysql-> select reverse('abc');
-> 'cba'
replace(str,from_str,to_str)
用字元串to_str替換字元串str中的子串from_str并傳回
mysql-> select replace('www.mysql.com', 'w', 'RK');
-> 'RKRKRK.mysql.com'
concat(str1,str2,...)
把參數連成一個長字元串并傳回(任何參數是null時傳回null)
mysql-> select concat('my', 's', 'ql');
-> 'mysql'
substring_index(str,delim,count)
傳回從字元串str的第count個出現的分隔符delim之後的子串
(count為正數時傳回左端,否則傳回右端子串)
mysql-> select substring_index('www.mysql.com', '.', 2);
-> 'www.mysql'
locate(substr,str)
傳回字元串substr在字元串str第一次出現的位置(str不包含substr時傳回0)
mysql-> select locate('sql', 'mysql');
-> 3
mysql-> select locate('xsq', 'mysql');
-> 0