MySql拆分字串(split拆分查詢)
阿新 • • 發佈:2019-01-04
最近碰到了一個需求,判斷當前登入使用者是否有許可權檢視這行資料,資料如表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的方式:
課程人員表 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 關聯 查詢出結果為:
張三 語文,數字,英語
-----------------------------------------------------------------------謝幕的分割線-----------------------------------------------------------------------------------------------