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

       最近碰到了一个需求,判断当前登录用户是否有权限查看这行数据,数据如表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
                 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(Coursecode    ) > 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 关联   查询出结果为:

张三    语文,数字,英语





-----------------------------------------------------------------------谢幕的分割线-----------------------------------------------------------------------------------------------
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值