My SQL 字串擷取 高階應用
- 工作需求
今天工作的時候遇到一個功能需求,就是資料庫中儲存有一個字串欄位,用分號隔開的多個字串,現在要傳入一個引數,這個引數也是用分隔符分開的多個字串,要判斷資料庫中的欄位中分號分割的任意一個字串是否在傳入的引數分隔符分開的任意字串中存在,舉個慄:
資料庫存入的欄位: 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