MySql拆分字符串(split拆分查找)
2016-07-22 00:47
555 查看
最近碰到了一个需求,判断当前登录用户是否有权限查看这行数据,数据如表A所示,如果当前用户具有A,D权限,那么他就能查到 列名为(1,2,3,5)这四条数据,因为要分页显示所以用Java去写显得很麻烦,所以用MySql的自定义
函数解决了,代码如下所示:
--------------------------------------------------------------邪恶的分割线----------------------------------------------------------------------------------
A表
设计思想如下:将传入的字符串进行拆分后,与数据库中相应的字段进行比对,一旦找到一个相同的就直接返回查询的序号即可。(该思路参考了网上的一些代码)
--------------------------------------------------------解释动作---------------------------------------------------------------------------------------------------------------------
-- 函数分解动作
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 关联 查询出结果为:
张三 语文,数字,英语
-----------------------------------------------------------------------谢幕的分割线-----------------------------------------------------------------------------------------------
函数解决了,代码如下所示:
--------------------------------------------------------------邪恶的分割线----------------------------------------------------------------------------------
列名 | 权限 |
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)
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 关联 查询出结果为:
张三 语文,数字,英语
-----------------------------------------------------------------------谢幕的分割线-----------------------------------------------------------------------------------------------
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- PreparedStatement中in子句的处理
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志