MySQL中的字符串分割函數(shù)及基本用法詳解
MySQL中的字符串分割函數(shù)
MySQL本身沒有內(nèi)置的SPLIT()函數(shù),但可以通過其他方式實(shí)現(xiàn)字符串分割功能。以下是幾種常見的方法:
1. SUBSTRING_INDEX函數(shù)
SUBSTRING_INDEX()是MySQL中最常用的字符串分割函數(shù),它可以根據(jù)指定的分隔符從字符串中提取子串,語法如下:
SUBSTRING_INDEX(str, delim, count)
含義:返回字符串 str 中按分隔符 delim 分割后的第 count 個子串。str: 要分割的字符串delim: 分隔符(可以是單個字符或多個字符)count:- 正數(shù):返回從左邊開始第count個分隔符之前的所有內(nèi)容
- 負(fù)數(shù):返回從右邊開始第count個分隔符之后的所有內(nèi)容
1、基本用法
-- 獲取第一個逗號前的內(nèi)容
SELECT SUBSTRING_INDEX('apple,banana,orange', ',', 1);
-- 結(jié)果: 'apple'
-- 獲取最后一個逗號后的內(nèi)容
SELECT SUBSTRING_INDEX('apple,banana,orange', ',', -1);
-- 結(jié)果: 'orange'
-- 獲取前兩個元素
SELECT
SUBSTRING_INDEX('apple,banana,orange', ',', 1) AS item1,
SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,orange', ',', 2), ',', -1) AS item2;
-- 結(jié)果: item1='apple', item2='banana'2. 處理多字符分隔符
-- 使用多字符作為分隔符
SELECT SUBSTRING_INDEX('apple||banana||orange', '||', 2);
-- 結(jié)果: 'apple||banana'
SELECT SUBSTRING_INDEX('apple||banana||orange', '||', -1);
-- 結(jié)果: 'orange'- 找到第一個 || 在 apple||banana||orange 的 apple 之后,此時已找到1次分隔符
- 找到第二個 || 在 banana 之后,此時已找到2次分隔符(達(dá)到count值)
- 函數(shù)返回從開頭到第二個 || 之前的所有內(nèi)容:‘apple||banana’
3. 邊界情況處理
-- 分隔符不存在時返回原字符串
SELECT SUBSTRING_INDEX('apple_banana_orange', ',', 1);
-- 結(jié)果: 'apple_banana_orange'
-- count超過實(shí)際分隔數(shù)時返回整個字符串
SELECT SUBSTRING_INDEX('apple,banana', ',', 5);
-- 結(jié)果: 'apple,banana'
-- 空字符串處理
SELECT SUBSTRING_INDEX('', ',', 1);
-- 結(jié)果: ''2. 使用正則表達(dá)式:REGEXP_SUBSTR
MySQL 8.0及以上版本支持正則表達(dá)式函數(shù):
-- 使用REGEXP_SUBSTR提取匹配的子串
SELECT REGEXP_SUBSTR('apple,banana,orange', '[^,]+', 1, 1) AS item1,
REGEXP_SUBSTR('apple,banana,orange', '[^,]+', 1, 2) AS item2;
-- 結(jié)果: item1='apple', item2='banana'3. 使用存儲過程實(shí)現(xiàn)完整分割
如果需要將字符串完全分割成多行,可以創(chuàng)建存儲過程:
DELIMITER //
CREATE PROCEDURE split_string(IN input_string VARCHAR(1000), IN delimiter_char VARCHAR(1))
BEGIN
DECLARE temp_string VARCHAR(1000);
DECLARE i INT DEFAULT 1;
DECLARE item VARCHAR(1000);
SET temp_string = input_string;
WHILE LENGTH(temp_string) > 0 DO
SET item = SUBSTRING_INDEX(temp_string, delimiter_char, 1);
SELECT item AS split_result;
SET temp_string = SUBSTRING(temp_string, LENGTH(item) + 2);
IF LENGTH(temp_string) = 0 THEN
LEAVE;
END IF;
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
-- 調(diào)用存儲過程
CALL split_string('apple,banana,orange', ',');4. 使用JSON函數(shù)(MySQL 5.7+)
MySQL 5.7及以上版本可以使用JSON函數(shù)處理字符串分割:
-- 將逗號分隔的字符串轉(zhuǎn)為JSON數(shù)組
SELECT
JSON_UNQUOTE(JSON_EXTRACT(CONCAT('["', REPLACE('apple,banana,orange', ',', '","'), '"]'), '$[0]')) AS item1,
JSON_UNQUOTE(JSON_EXTRACT(CONCAT('["', REPLACE('apple,banana,orange', ',', '","'), '"]'), '$[1]')) AS item2;
-- 結(jié)果: item1='apple', item2='banana'實(shí)際應(yīng)用示例
假設(shè)有一個表格包含逗號分隔的標(biāo)簽字段:
CREATE TABLE products (
id INT,
name VARCHAR(100),
tags VARCHAR(255)
);
INSERT INTO products VALUES
(1, 'Laptop', 'electronics,computer,premium'),
(2, 'Phone', 'electronics,mobile'),
(3, 'Desk', 'furniture,office');
-- 查詢所有電子類產(chǎn)品
SELECT * FROM products
WHERE FIND_IN_SET('electronics', tags) > 0;注意:對于復(fù)雜的字符串分割需求,建議在應(yīng)用層處理(如Python、Java等),或者在數(shù)據(jù)庫設(shè)計(jì)時就避免使用分隔符存儲多個值(遵循第一范式)。
練習(xí)題
select
SUBSTRING_INDEX (profile, ',', -1) as gender,
count(*) as number
from
user_submit
group by
genderselect
device_id,
substring_index (blog_url, "/", -1) as user_name
from
user_submitselect
substring_index (substring_index (profile, ",", 3), ",", -1) as age,
count(*) as number
from
user_submit
group by
ageSQL83 商品id數(shù)據(jù)清洗統(tǒng)計(jì)
select
# SUBSTRING_INDEX (order_id, '_', -1) as product_id,
regexp_substr(order_id,'p[0-9]+$') as product_id,
count(*) as cnt
from order_log
group by product_id
order by cnt desc,product_id asc;- ‘p[0-9]+$’: 正則表達(dá)式模式
- p: 匹配字母 “p”
- [0-9]+: 匹配一個或多個數(shù)字(0-9)
- $: 匹配字符串的結(jié)尾
到此這篇關(guān)于MySQL中的字符串分割函數(shù)的文章就介紹到這了,更多相關(guān)mysql字符串分割函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫跨版本遷移的實(shí)現(xiàn)三種方式
本文主要介紹了MySQL數(shù)據(jù)庫跨版本遷移的實(shí)現(xiàn),主要包含mysqldump,物理文件遷移和原地升級三種,具有一定的參考價值,感興趣的可以了解一下2024-05-05
MySQL8新特性之降序索引底層實(shí)現(xiàn)詳解
這篇文章主要介紹了MySQL8新特性之降序索引底層實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

