Mysql通過存儲過程分割字符串為數(shù)組
分割字符串為數(shù)組需要用到 三個mysql 的函數(shù) :
REVERSE(str) 返回顛倒字符順序的字符串str。
SUBSTRING_INDEX(str,delim,count)
返回從字符串str的第count個出現(xiàn)的分隔符delim之后的子串。如果count是正數(shù),返回最后的分隔符到左邊(從左邊數(shù)) 的所有字符。如果count是負(fù)數(shù),返回最后的分隔符到右邊的所有字符(從右邊數(shù))。
REPLACE(str,from_str,to_str)
返回字符串str,其字符串from_str的所有出現(xiàn)由字符串to_str代替。
通過三個函數(shù)的組合使用做到分割字符串為數(shù)組的功能。
首先寫兩個函數(shù)
1,獲得所有以“某個符號“分割的字符串的個數(shù),函數(shù)內(nèi)容如下
(將sql代碼復(fù)制放在navicat中執(zhí)行即可)
DELIMITER $$ CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string_total`( f_string varchar(1000),f_delimiter varchar(5) ) RETURNS int(11) BEGIN -- Get the total number of given string. return 1+(length(f_string) - length(replace(f_string,f_delimiter,''))); END$$ DELIMITER ;
2、按分割取出字符串
(將sql代碼復(fù)制放在navicat中執(zhí)行即可)
DELIMITER $$ CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string`( f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8 BEGIN -- Get the separated number of given string. declare result varchar(255) default ''; set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1)); return result; END$$ DELIMITER ;
然后再寫一個存儲過程進(jìn)行組合使用這兩個函數(shù),輸入需要分割的字符串 ,和分隔符,輸出 按某某符號分割后的數(shù)組
(將sql代碼復(fù)制放在navicat中執(zhí)行即可)
DELIMITER $$ CREATE PROCEDURE `sp_print_result`( IN f_string varchar(1000),IN f_delimiter varchar(5) ) BEGIN -- Get the separated string. declare cnt int default 0; declare i int default 0; set cnt = func_get_split_string_total(f_string,f_delimiter); drop table if exists tmp_print; create temporary table tmp_print (num int not null); while i < cnt do set i = i + 1; insert into tmp_print(num) values (func_get_split_string(f_string,f_delimiter,i)); end while; select * from tmp_print; END$$ DELIMITER ;
然后輸入字符串進(jìn)行測試。
call sp_print_result(“434,123,12,234,123,123”,”,”);
結(jié)果如下圖
可能執(zhí)行的時候會報錯:The user specified as a definer (‘root'@'%') does not exist
解決方法如下:
執(zhí)行 :grant all privileges on *.* to root@"%" identified by ".";
執(zhí)行 :flush privileges;
就解決了這個問題。
最后說一下存儲過程和mysql的函數(shù)
存儲過程是用戶定義的一系列sql語句的集合,涉及特定表或其它對象的任務(wù),用戶可以調(diào)用存儲過程,而函數(shù)通常是數(shù)據(jù)庫已定義的方法,它接收參數(shù)并返回某種類型的值并且不涉及特定用戶表。
存儲過程和函數(shù)存在以下幾個區(qū)別:
1)一般來說,存儲過程實現(xiàn)的功能要復(fù)雜一點,而函數(shù)的實現(xiàn)的功能針對性比較強(qiáng)。存儲過程,功能強(qiáng)大,可以執(zhí)行包括修改表等一系列數(shù)據(jù)庫操作;用戶定義函數(shù)不能用于執(zhí)行一組修改全局?jǐn)?shù)據(jù)庫狀態(tài)的操作。
2)對于存儲過程來說可以返回參數(shù),如記錄集,而函數(shù)只能返回值或者表對象。函數(shù)只能返回一個變量;而存儲過程可以返回多個。存儲過程的參數(shù)可以有IN,OUT,INOUT三種類型,而函數(shù)只能有IN類~~存儲過程聲明時不需要返回類型,而函數(shù)聲明時需要描述返回類型,且函數(shù)體中必須包含一個有效的RETURN語句。
3)存儲過程,可以使用非確定函數(shù),不允許在用戶定義函數(shù)主體中內(nèi)置非確定函數(shù)。
4)存儲過程一般是作為一個獨立的部分來執(zhí)行( EXECUTE 語句執(zhí)行),而函數(shù)可以作為查詢語句的一個部分來調(diào)用(SELECT調(diào)用),由于函數(shù)可以返回一個表對象,因此它可以在查詢語句中位于FROM關(guān)鍵字的后面。 SQL語句中不可用存儲過程,而可以使用函數(shù)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Mysql實現(xiàn)定時清空一張表的舊數(shù)據(jù)并保留幾條數(shù)據(jù)(推薦)
這篇文章主要介紹了Mysql實現(xiàn)定時清空一張表的舊數(shù)據(jù)并保留幾條數(shù)據(jù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12將MySQL從MyISAM轉(zhuǎn)換成InnoDB錯誤和解決辦法
原來自己用的是為了裝的, 所以在設(shè)置database usage(如下圖1)的時候按照discuz官方的建議,選的都是Non-Transactional Database Only(只支持MyISAM數(shù)據(jù)引擎的非事務(wù)數(shù)據(jù)庫),用MyISAM數(shù)據(jù)庫,還沒涉及到需要InnoDB,因此打算直接不加載INNODB引擎。2011-09-09Linux7.6二進(jìn)制安裝Mysql8.0.27詳細(xì)操作步驟
大家好,本篇文章主要講的是Linux7.6二進(jìn)制安裝Mysql8.0.27詳細(xì)操作步驟,感興趣的同學(xué)快來看一看吧,希望對你起到幫助2021-11-11利用MySQL加密函數(shù)保護(hù)Web網(wǎng)站敏感數(shù)據(jù)的方法分享
如果您正在運行使用MySQL的Web應(yīng)用程序,那么它把密碼或者其他敏感信息保存在應(yīng)用程序里的機(jī)會就很大2012-03-03