MySQL中的字符串分割函數(shù)及基本用法詳解
MySQL中的字符串分割函數(shù)
MySQL本身沒有內(nèi)置的SPLIT()函數(shù),但可以通過(guò)其他方式實(shí)現(xiàn)字符串分割功能。以下是幾種常見的方法:
1. SUBSTRING_INDEX函數(shù)
SUBSTRING_INDEX()是MySQL中最常用的字符串分割函數(shù),它可以根據(jù)指定的分隔符從字符串中提取子串,語(yǔ)法如下:
SUBSTRING_INDEX(str, delim, count)
含義:返回字符串 str 中按分隔符 delim 分割后的第 count 個(gè)子串。str: 要分割的字符串delim: 分隔符(可以是單個(gè)字符或多個(gè)字符)count:- 正數(shù):返回從左邊開始第count個(gè)分隔符之前的所有內(nèi)容
- 負(fù)數(shù):返回從右邊開始第count個(gè)分隔符之后的所有內(nèi)容
1、基本用法
-- 獲取第一個(gè)逗號(hào)前的內(nèi)容
SELECT SUBSTRING_INDEX('apple,banana,orange', ',', 1);
-- 結(jié)果: 'apple'
-- 獲取最后一個(gè)逗號(hào)后的內(nèi)容
SELECT SUBSTRING_INDEX('apple,banana,orange', ',', -1);
-- 結(jié)果: 'orange'
-- 獲取前兩個(gè)元素
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'- 找到第一個(gè) || 在 apple||banana||orange 的 apple 之后,此時(shí)已找到1次分隔符
- 找到第二個(gè) || 在 banana 之后,此時(shí)已找到2次分隔符(達(dá)到count值)
- 函數(shù)返回從開頭到第二個(gè) || 之前的所有內(nèi)容:‘apple||banana’
3. 邊界情況處理
-- 分隔符不存在時(shí)返回原字符串
SELECT SUBSTRING_INDEX('apple_banana_orange', ',', 1);
-- 結(jié)果: 'apple_banana_orange'
-- count超過(guò)實(shí)際分隔數(shù)時(shí)返回整個(gè)字符串
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. 使用存儲(chǔ)過(guò)程實(shí)現(xiàn)完整分割
如果需要將字符串完全分割成多行,可以創(chuàng)建存儲(chǔ)過(guò)程:
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)用存儲(chǔ)過(guò)程
CALL split_string('apple,banana,orange', ',');4. 使用JSON函數(shù)(MySQL 5.7+)
MySQL 5.7及以上版本可以使用JSON函數(shù)處理字符串分割:
-- 將逗號(hào)分隔的字符串轉(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è)有一個(gè)表格包含逗號(hào)分隔的標(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;注意:對(duì)于復(fù)雜的字符串分割需求,建議在應(yīng)用層處理(如Python、Java等),或者在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)就避免使用分隔符存儲(chǔ)多個(gè)值(遵循第一范式)。
練習(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]+: 匹配一個(gè)或多個(gè)數(shù)字(0-9)
- $: 匹配字符串的結(jié)尾
到此這篇關(guān)于MySQL中的字符串分割函數(shù)的文章就介紹到這了,更多相關(guān)mysql字符串分割函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL時(shí)區(qū)導(dǎo)致時(shí)間差了14或13小時(shí)的解決方法
本文主要介紹了MYSQL時(shí)區(qū)導(dǎo)致時(shí)間差了14或13小時(shí)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
高效數(shù)據(jù)流轉(zhuǎn):Mycat分庫(kù)分表與GreatSQL實(shí)時(shí)同步
聚焦數(shù)據(jù)庫(kù)擴(kuò)容與實(shí)時(shí)數(shù)據(jù)同步,探索MyCat分庫(kù)分表與GreatSQL的強(qiáng)大結(jié)合!想在大規(guī)模數(shù)據(jù)處理中游刃有余?本指南將帶你輕松掌握MyCat的分布式解決方案和GreatSQL的實(shí)時(shí)同步機(jī)制,讓高效、穩(wěn)定的數(shù)據(jù)庫(kù)管理觸手可及,一起揭開高并發(fā)環(huán)境下數(shù)據(jù)庫(kù)優(yōu)化的神秘面紗吧!2024-01-01
mysql時(shí)間戳轉(zhuǎn)成常用可讀時(shí)間格式的兩種方法
mysql時(shí)間戳轉(zhuǎn)成常用可讀時(shí)間格式的兩種方法,需要的朋友可以參考下。2010-09-09
Finished with error:Navicat運(yùn)行SQL文件報(bào)錯(cuò)的解決
這篇文章主要介紹了Finished with error:Navicat運(yùn)行SQL文件報(bào)錯(cuò)的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
MYSQL updatexml()函數(shù)報(bào)錯(cuò)注入解析
這篇文章主要介紹了MYSQL updatexml()函數(shù)報(bào)錯(cuò)注入解析,并且簡(jiǎn)單介紹了updatexml函數(shù),具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
使用Grafana+Prometheus監(jiān)控mysql服務(wù)性能
這篇文章主要介紹了使用Grafana+Prometheus監(jiān)控mysql服務(wù)性能的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下方法2020-03-03

