1. 程式人生 > >MySql拆分字串(split拆分查詢)

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   --從一開始迴圈 DOset 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 關聯   查詢出結果為:

張三    語文,數字,英語

-----------------------------------------------------------------------謝幕的分割線-----------------------------------------------------------------------------------------------