MySQL拆分字串和遞迴查詢

2021-10-07 07:29:18 字數 3616 閱讀 3119

一,最近遇到乙個需求,要將資料對市級進行彙總,但是由於系統資料都是很老了的,而且乙個欄位上存著***省/***市/***區這種資料,但是我們只需要根據市進行相關彙總操作,所以自己寫乙個函式把原來的字段的值拆分出來只返回***市,廢話不多說看一下**吧

//先建立乙個臨時表

create table `temp_prepare` (

`area_name` varchar(255) character set utf8 default null comment '區域名稱',

`source_id` varchar(32) character set utf8 default null comment '**id'

) engine=innodb default charset=utf8mb4;

create definer=`root`@`%` function `string_split`(old_string varchar(300),symbol varchar(5),

source_id varchar(32)) returns varchar(100) charset utf8

begin

# 求分割符號','的位置

declare _index int;

declare new_string varchar(100);

#清除臨時表資料

delete from temp_prepare;

set _index = locate(symbol,old_string);

while _index > 0

doinsert into temp_prepare values(left(old_string,_index-1),source_id);#將子字串存入臨時表

set old_string =substr(old_string from _index+1);

set _index = locate(symbol,old_string);

end while;

if length(old_string) >= 0 then

insert into temp_prepare values(old_string,source_id);

end if;

select t.area_name into new_string from temp_prepare t where t.source_id = source_id and t.area_name like '%市'

limit 1;

return new_string;

end

然後看一下效果吧:

二,遞迴查詢當前部門的所有下級,mysql沒有現成的函式方法使用,所以也要自己寫乙個函式

先看下部門表:

返回的不包含自身的下級資訊 

create definer=`root`@`%` function `getchildrenlist`(rootid varchar(4000)) returns varchar(4000) charset utf8

begin

declare otemp varchar(4000);

declare otempchild varchar(4000);

declare count int;

set otemp = '';

set otempchild = rootid;

while otempchild is not null

doset otemp = concat(otemp,',',otempchild);

select group_concat(id) into otempchild from t_post_item where find_in_set(parent_id,otempchild) > 0;

end while;

-- 返回的不包含自身的下級資訊(先判斷有幾個逗號)

set count = length(otemp) - length( replace (otemp, ',', ''));

-- 逗號超過乙個,說明有下級,反之沒有下級

if count > 1 then

set otemp = replace(otemp,concat(',',rootid,','),'');

else

set otemp = replace(otemp,concat(',',rootid),'');

end if;

return otemp;

end

//查詢專案經理以及所有下級(不包含自己)

返回的包含自身以及下級資訊

create definer=`root`@`%` function `getchildrenlist`(rootid varchar(4000)) returns varchar(4000) charset utf8

begin

declare otemp varchar(4000);

declare otempchild varchar(4000);

declare count int;

set otemp = '';

set otempchild = rootid;

while otempchild is not null

doset otemp = concat(otemp,',',otempchild);

select group_concat(id) into otempchild from t_post_item where find_in_set(parent_id,otempchild) > 0;

end while;

-- 返回的包含自身以及下級資訊

set otemp = substring(otemp,2);

return otemp;

end

//查詢專案經理以及所有下級(包含自己)

mysql拆分字串

函式 1 從左開始擷取字串 left str,length 說明 left 被擷取字段,擷取長度 例 select left make date,4 as year from t sale billing where make date 2017 06 24 2 從右開始擷取字串 right str...

mysql拆分字串函式

業務需求 拆分字串,然後將數字轉換成中文描述,返回成以,分割的中文描述 修改結束符,防止在mysql命令列中預設分號直接執行 delimiter 建立乙個計算拆分後字串的個數函式 drop function if exists calc length create function calc len...

oracle拆分字串並查詢

樣例sql select gro.regexp substr group name,1,1 as one group,regexp substr group name,1,2 as two group,regexp substr group name,1,3 as three group,cfg.a...