- 工作需求
今天工作的时候遇到一个功能需求,就是数据库中保存有一个字符串字段,用分号隔开的多个字符串,现在要传入一个参数,这个参数也是用分隔符分开的多个字符串,要判断数据库中的字段中分号分割的任意一个字符串是否在传入的参数分隔符分开的任意字符串中存在,举个栗:
数据库存入的字段: 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