首頁 > 資料庫 > mysql教程 > Mysql如何將字串依照指定字元分割

Mysql如何將字串依照指定字元分割

WBOY
發布: 2023-06-03 14:00:13
轉載
4555 人瀏覽過

前言

在某些場景下(例如:使用者上傳檔案或圖片等),一般的做法是將檔案資訊(檔案名,檔案路徑,檔案大小等)儲存到檔案表(user_file )中,然後再將使用者所有上傳的檔案的id用一個指定字元拼接然後存在表格(user)中某個欄位裡(假設是:file_ids)。
在展示使用者上傳的檔案時就直接查詢文件表中就好了:

-- 一般的语句是这样的,假设用户唯一键是id
select * from file where id in(select file_ids from user where id = 1);
登入後複製

sql語句沒有問題,檔案也能查詢出來,但是,上傳的檔案大於1個後,再用這個sql語句查詢就只回傳1筆記錄了,可能就會懷疑了,為什麼只回傳一筆記錄? ? ? ;

肯定有人做過這樣的驗證

-- 先运行下面这个sql,正确返回1,2,3 假设上传的文件id是1,2,3;
select file_ids from user where id = 1
-- 然后返回的文件id写死在sql语句中,运行成功返回3条记录
select file_ids from user where id in ('1' , '2' , '3');
-- 最后再整体试了下,结果返回一条......
select * from file where id in(select file_ids from user where id = 1)

-- 然后可能会想到:我把in里面的拼接成'1','2','3',这样总可以了吧?
select * from file where id in (select concat('\'', replace(file_ids,',','\',\'') ,'\'') from user where id = 1);
-- concat('\'', replace(file_ids,',','\',\'') ,'\'') 确实能拼接成上面说的形式,但是结果还是只有一条
登入後複製

是因為這個查詢只回傳一個字段,所以只會傳回一筆記錄(即使有多個逗號拼接,或是手動拼接的, Mysql只認為是一個值,具體底層不清楚…),正確做法如下:

一:分兩次查詢(不是本文重點,但可以實現)

select file_ids from user where id = 1

select file_ids from user where id in ('1' , '2' , '3');
或者
select file_ids from user where find_in_set(id , '1,2,3');
登入後複製

二:將file_ids欄位分割成多列,類似Mysql的行轉列

與Mysql行轉列區別:行轉列要知道列的內容,而這個不用,只要知道拼接的字元就行了

-- 下面语句将会把1,2,3,4一个字段转换成四行,依次是1,2,3,4
SELECT
	a.id,
	a.file_ids,
	substring_index(
		substring_index(
			a.file_ids,
			',',
			b.help_topic_id + 1
		),
		',' ,- 1
	) file_id
FROM
	user a
JOIN mysql.help_topic b ON b.help_topic_id < (
	length(a.file_ids) - length(REPLACE(a.file_ids, &#39;,&#39;, &#39;&#39;)) + 1
)
where id = 1
;
-- 然后将上面语句写在in()里面就行了,写在in()里面的话记住只能查询一个字段哦!
登入後複製

上面語句可以直接複製過去,只要將a表及a表字段換成自己的表明及字段就行了,至於mysql.help_topic,是Mysql自帶的,不用管的。

附:mysql如何將字串以分隔符號拆分

1.字串拆分:SUBSTRING_INDEX(pressure 136/70 血壓),例如:

SUBSTRING_INDEX(pressure ,&#39;,&#39;,1)     #截取第一个逗号(,)号以前的字符串
SUBSTRING_INDEX(pressure ,&#39;,&#39;,-1)    #截取倒数第一个逗号(,)号以后的字符串
登入後複製

2 .替換函數:replace( str, from_str, to_str)。例如:

UPDATE bgs_building_copy1 SET `name`=replace(`name`,&#39;=&#39;,"");    #替换等号为空字符串
登入後複製

以上是Mysql如何將字串依照指定字元分割的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板