欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySql字符串拆分實現(xiàn)split功能(字段分割轉(zhuǎn)列)

 更新時間:2022年05月20日 16:13:57   作者:堯上有農(nóng)  
本文主要介紹了MySql字符串拆分實現(xiàn)split功能(字段分割轉(zhuǎn)列),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

需求描述

數(shù)據(jù)庫中 num字段值為:

在這里插入圖片描述

實現(xiàn)的效果:需要將一行數(shù)據(jù)變成多行

實現(xiàn)的sql

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
FROM mysql.help_topic 
WHERE help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

案例演示

CREATE TABLE `company` (
`id` int(20) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`shareholder` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `company` VALUES ('1', '阿里巴巴', '馬云');
INSERT INTO `company` VALUES ('2', '淘寶', '馬云,孫正義');

1、原始數(shù)據(jù)演示

在這里插入圖片描述

2、處理結(jié)果演示

在這里插入圖片描述

3、sql語句

SELECT a.id
    , a.NAME
    , substring_index(substring_index(a.shareholder, ',', b.help_topic_id + 1), ',', - 1) AS shareholder
FROM company a
INNER JOIN mysql.help_topic b
    ON b.help_topic_id < (length(a.shareholder) - length(REPLACE(a.shareholder, ',', '')) + 1)

涉及的知識點如下:

字符串拆分: SUBSTRING_INDEX(str, delim, count)

參數(shù)解說       解釋
str         需要拆分的字符串
delim         分隔符,通過某字符進(jìn)行拆分
count          當(dāng) count 為正數(shù),取第 n 個分隔符之前的所有字符; 當(dāng) count 為負(fù)數(shù),取倒數(shù)第 n 個分隔符之后的所有字符。

舉例

(1)獲取第2個以逗號為分隔符之前的所有字符。

SELECT SUBSTRING_INDEX('7654,7698,7782,7788',',',2);

在這里插入圖片描述

(2)獲取最后一個到倒數(shù)第2個以逗號分隔符之后的所有字符

SELECT SUBSTRING_INDEX('7654,7698,7782,7788',',',-2);

在這里插入圖片描述

所以,我們的核心代碼中的 -1 ,就是獲取以逗號為分隔符的最后一個值;也就是7788

在這里插入圖片描述

替換函數(shù):replace( str, from_str, to_str)

參數(shù)名       解釋
str        需要進(jìn)行替換的字符串
from_str     需要被替換的字符串
to_str       需要替換的字符串

舉例

將分隔符逗號替換為空。

SELECT REPLACE('7654,7698,7782,7788',',','');

在這里插入圖片描述

獲取字符串長度:LENGTH( str )

參數(shù)名   解釋
str     需要計算長度的字符串

獲取 ‘7654,7698,7782,7788’ 字符串的長度

SELECT LENGTH('7654,7698,7782,7788')

在這里插入圖片描述

實現(xiàn)的原理解析

【4.1】 實現(xiàn)sql

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
FROM mysql.help_topic 
WHERE help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

此處利用 mysql 庫的 help_topic 表的 help_topic_id 來作為變量,因為 help_topic_id 是自增的,當(dāng)然也可以用其他表的自增字段輔助。

help_topic 表:

在這里插入圖片描述

在這里插入圖片描述

注意,這個輔助表的ID最大長度只有658;如果過長的字符串,可能需要借助其他自增的輔助表(可以是現(xiàn)有表,也可以自己造一個 1,2,3,4 遞增的行即可)

在這里插入圖片描述

【4.2】正式的原理解析

原SQL

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
FROM   mysql.help_topic 
WHERE  help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

Step1:首先獲取最后需被拆分成多少個字符串,利用 help_topic_id 來模擬遍歷 第n個字符串。

這一步核心就是獲取,有多少個分隔符,比如本文的案例,就是知道有多少個逗號

涉及的代碼片段:

help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

在這里插入圖片描述

因為 help_topic_id是從0開始的,所以會得出 help_topic_id 值為:0~3,共4行數(shù)據(jù);

Step2:根據(jù)“,”逗號來拆分字符串,此處利用 SUBSTRING_INDEX(str, delim, count) 函數(shù),最后把結(jié)果賦值給 num 字段。

涉及的代碼片段:

SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 

第一步:

以”,”逗號為分隔符,根據(jù) help_topic_id 的值來截取第n+1個分隔符之前所有的字符串。 (此處 n+1 是因為help_topic_id 是從0開始算起,而此處需從第1個分隔符開始獲取。)

SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1)

eg: 
當(dāng) help_topic_id = 0時,獲取到的字符串 = 7654 
當(dāng) help_topic_id = 1時,獲取到的字符串 = 7654,7698 …(以此類推)

第二步:

以”,”逗號為分隔符,截取倒數(shù)第1個分隔符之后的所有字符串。

SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1)

eg: 
根據(jù)第一步,當(dāng) help_topic_id = 0時,獲取到的字符串 = 7654,此時第二步截取的字符串 = 7654 
根據(jù)第一步,當(dāng) help_topic_id = 1時,獲取到的字符串 = 7654,7698,此時第二步截取的字符串 = 7698 
…(以此類推)

最終成功實現(xiàn)了以下效果 ~

在這里插入圖片描述

擴(kuò)展:判斷外部值是否在 num列值中

5.1】find_in_set

如果匹配到了會得出1;如下圖

在這里插入圖片描述

實際業(yè)務(wù)中,我們只需要 where find_in_set(id,ids)>0

就可以判斷出;id列,是否在 ids列中出現(xiàn)過;做表連接的時候,也可以這樣;

5.2】instr

在這里插入圖片描述

我們可以看出,instr是找出 參數(shù)2=》也就是上圖中的 ‘123’ 在參數(shù)1=》也就是上圖中的 ‘321,123,555,12345’ 中最開始出現(xiàn)的位置;

所以我們也只需要 where find_in_set(ids,id)>0 ,就可以判斷出 id 在 ids中出現(xiàn)過;

但這有一個問題,如果逗號分隔開的字符串,包含我們查找的字符串,也會顯示出來,這就不符合我們 根據(jù)分隔符 , 判斷 查找字符串id 是否出現(xiàn)在 ids 中;

如下:

在這里插入圖片描述

我們本來想查以逗號為分隔的完全匹配,但是12345包含了 123 所以查出來的結(jié)果也是>0的,這不對;

所以我們?yōu)榱吮苊膺@種情況,可以加上分隔符;然后再用 字符串+分隔符作為 查找的字符串 來 匹配;

在這里插入圖片描述

在這里插入圖片描述

我們被查找的字符串 ids 中 再加上一個正常的 123, 再查看,如下圖:確實是對的

在這里插入圖片描述

文章參考

https://blog.csdn.net/pjymyself/article/details/81668157

https://www.cnblogs.com/gered/p/10797012.html#_label1

到此這篇關(guān)于MySql字符串拆分實現(xiàn)split功能(字段分割轉(zhuǎn)列)的文章就介紹到這了,更多相關(guān)MySql字符串拆分內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決Linux安裝mysql報錯:失敗的軟件包是:mysql-community-libs-8.0.37-1.el7.x86_64?GPG

    解決Linux安裝mysql報錯:失敗的軟件包是:mysql-community-libs-8.0.37-1.el7.x

    mysql是一款常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),常常被用于各類web應(yīng)用中,這篇文章主要給大家介紹了關(guān)于如何解決Linux安裝mysql報錯:失敗的軟件包是:mysql-community-libs-8.0.37-1.el7.x86_64?GPG的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • MySQL字符串的拼接、截取、替換、查找位置實例詳解

    MySQL字符串的拼接、截取、替換、查找位置實例詳解

    MySQL中的字符串操作包括拼接、截取、替換和查找位置等功能,本文給大家介紹MySQL字符串的拼接、截取、替換、查找位置示例詳解,感興趣的朋友一起看看吧
    2024-09-09
  • MySQL?去重實例操作詳解

    MySQL?去重實例操作詳解

    這篇文章主要介紹了MySQL?去重實例操作詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • MySQL InnoDB如何保證事務(wù)特性示例詳解

    MySQL InnoDB如何保證事務(wù)特性示例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL InnoDB如何保證事務(wù)特性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • mysql日志文件General_log和Binlog開啟及詳解

    mysql日志文件General_log和Binlog開啟及詳解

    MySQL中的數(shù)據(jù)變化會體現(xiàn)在上面日志中,下面這篇文章主要給大家介紹了關(guān)于mysql日志文件General_log和Binlog開啟及詳解的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Mysql學(xué)習(xí)之創(chuàng)建和操作數(shù)據(jù)庫及表DDL大全小白篇

    Mysql學(xué)習(xí)之創(chuàng)建和操作數(shù)據(jù)庫及表DDL大全小白篇

    本篇文章是MySQL小白入門篇,主要講解創(chuàng)建和操縱數(shù)據(jù)庫及表懂得了,內(nèi)容非常全面,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • mysql 5.7.14 安裝配置方法圖文教程

    mysql 5.7.14 安裝配置方法圖文教程

    這篇文章主要為大家分享了mysql 5.7.14安裝配置方法圖文教程,感興趣的朋友可以參考一下
    2016-08-08
  • MySQL限制查詢和數(shù)據(jù)排序介紹

    MySQL限制查詢和數(shù)據(jù)排序介紹

    這篇文章主要介紹了MySQL限制查詢和數(shù)據(jù)排序介紹,通過limit可以限制返回結(jié)果的行數(shù),而當(dāng)數(shù)據(jù)查詢出來以后,我們可以對數(shù)據(jù)進(jìn)行排序處理。在末尾使用order?by語句,下文相關(guān)詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-03-03
  • MySQL主從復(fù)制與讀寫分離的使用示例

    MySQL主從復(fù)制與讀寫分離的使用示例

    在企業(yè)應(yīng)用中,成熟的業(yè)務(wù)通常數(shù)據(jù)量都比較大,所以需要配置多臺主從數(shù)據(jù)服務(wù)器以實現(xiàn)讀寫分離,本文主要介紹了MySQL主從復(fù)制與讀寫分離的使用示例,感興趣的可以了解一下
    2023-09-09
  • MySQL日期格式以及日期函數(shù)舉例詳解

    MySQL日期格式以及日期函數(shù)舉例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL日期格式及日期函數(shù)的相關(guān)資料,日期在數(shù)據(jù)庫中是一個常見且重要的數(shù)據(jù)類型,在MySQL中我們可以使用各種函數(shù)和格式化選項來處理和顯示日期,需要的朋友可以參考下
    2023-11-11

最新評論