最近碰到了一个需求,判断当前登录用户是否有权限查看这行数据,数据如表A所示,如果当前用户具有A,D权限,
那么他就能查到 列名为(1,2,3,5)这四条数据,因为要分页显示所以用Java去写显得很麻烦,所以用MySql的自定义
函数解决了,代码如下所示:
--------------------------------------------------------------邪恶的分割线----------------------------------------------------------------------------------
列名 | 权限 |
1 | A,B,C |
2 | A,B |
3 | A,D |
4 | B,C |
5 | B,C,D |
设计思想如下:
将传入的字符串进行拆分后,与数据库中相应的字段进行比对,一旦找到一个相同的就直接返回查询的序号即可。(该思路参考了网上的一些代码)
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)
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 关联 查询出结果为:
张三 语文,数字,英语
-----------------------------------------------------------------------谢幕的分割线-----------------------------------------------------------------------------------------------