您的位置:首页 > 数据库 > MySQL

MySql拆分字符串(split拆分查找)

2016-07-22 00:47 555 查看
       最近碰到了一个需求,判断当前登录用户是否有权限查看这行数据,数据如表A所示,如果当前用户具有A,D权限,那么他就能查到 列名为(1,2,3,5)这四条数据,因为要分页显示所以用Java去写显得很麻烦,所以用MySql的自定义
函数解决了,代码如下所示:

--------------------------------------------------------------邪恶的分割线----------------------------------------------------------------------------------

列名权限
1A,B,C
2A,B
3A,D
4B,C
5B,C,D
                 A表

设计思想如下:将传入的字符串进行拆分后,与数据库中相应的字段进行比对,一旦找到一个相同的就直接返回查询的序号即可。(该思路参考了网上的一些代码)

DROP FUNCTION IF EXISTS `findRole `;
 
DROP FUNCTION IF EXISTS `findRole`;
CREATE FUNCTION `findRole`(targetStr varchar(2000),findStr varchar(2000))
 RETURNS varchar(1000)
BEGIN
DECLARE strNum int;
DECLARE lenIndex int DEFAULT 1;
DECLARE cStr VARCHAR(50);
DECLARE flag INT;  -- 标志位
SET strNum=1+(length(targetStr) - length(replace(targetStr,',','')));
WHILE lenIndex<=strNum   -- 从一开始循环
DO
set cStr=reverse(substring_index(reverse(substring_index(targetStr,',',lenIndex)),',',1));-- 这一步的含义请参考函数分解自己实一下,就明白了
set flag=FIND_IN_SET(cStr,findStr);
if (flag>0&&cStr!='') THEN
RETURN flag;
END IF;
set lenIndex=lenIndex+1;
END WHILE;
RETURN 0;
END;--并且进行比较


--------------------------------------------------------解释动作---------------------------------------------------------------------------------------------------------------------

-- 函数分解动作
select length('111,3213,333')   -- 12
select  replace('111,3213,333',',','')    ---1113213333

select length(replace('111,3213,333',',','')) -- 10
select 1+(length('111,3213,333')-length(replace('111,3213,333',',',''))) -- 3 表示有三个需要拆分
select reverse(substring_index('111,3213,333',',',3))
select reverse(substring_index(reverse(substring_index('111,3213,333',',',3)),',',1)); -- 翻转的在翻转就可以取得第一个数
select LOCATE('111','555,777,111');  -- 返回子串 substr 在字符串 str 中的第 pos 位置后第一次出现的位置。



使用方法:
select * from A表 where findRole("A,D",A表.权限)>0)  

Oracle的方式:

SELECT
(select wm_concat(name)
from keming where
instr(Course, code
   ) > 0) FROM renyuan  where name ='张三'

解决如下问题

我现在有一个字段是存:1,2,3的,而它对应另一张值集表中。eg;

课程人员表 renyuan 
id    name     Course
1     张三      1,2,3

值集表    keming 
    code    name
     1       语文
     2       数字
      3       英语
………………

course 与code 关联   查询出结果为:

张三    语文,数字,英语

-----------------------------------------------------------------------谢幕的分割线-----------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息