MySQL字符數據查詢拆分

MySQL字符數據查詢拆分

問題描述

數據表中某字段為特定單詞組字符串,特定字符分隔。
現有需求在不影響原始數據的情況下,查詢顯示拆分后的單詞,方便后續對其進行后續操作。

演示

演示數據源

    -- 測試表結構create table word_table(words varchar(255) null);-- 表數據INSERT INTO test.word_table(words) VALUES ('apple,orange,lemon');INSERT INTO test.word_table(words) VALUES ('computer,apple');INSERT INTO test.word_table(words) VALUES ('laddy,man,woman');

涉及MySQL內置表/內置函數

MySQL內置表
  • mysql.help_topic

    mysql.help_topic本身是Mysql的一張信息表,用來存儲各種注釋等幫助信息。這里需要借助該表中的help_topic_id字段數據,其有特點:help_topic_id 從0開始,固定數量的(和數據庫版本有關),我這里為0~699。

        -- 查看help_topic_id序列總數SELECT help_topic_id FROM mysql.help_topic ORDER BY help_topic_id ASC
    
    -- 測試
    SELECT help_topic_id FROM mysql.help_topic WHERE help_topic_id<2
    
    +---------------+
    | help_topic_id |
    +---------------+
    |             0 |
    |             1 |
    +---------------+
    2 rows in set (0.00 sec)
    
內置函數
  • LENGTH(str)

    返回str中的字符個數

  • REPLACE(str, old_sub_str, new_sub_str)

    替換str中 舊的子字串 為 新的子字符串

  • SUBSTRING_INDEX(str, sub_str, count)

    返回 str 中 第 count 次 查找到 sub_str 之前的字符串,不包含最后一次查找到的sub_str

    如:SUBSTRING_INDEX("a,b,a,c,a,d",'a',3) ==> "a,b,a,c,"

    注意如果count為負數,則表示從右邊查找,并返回右邊的字符串

    mysql> -- 拆分單詞
    mysql> -- SUBSTRING_INDEX(str, sub_str, count):在str中查找delim,返回查找到的第count個sub_str之前的字符串(從左開始)
    mysql> -- 如果count為負數,則從右開始
    mysql> -- 示例:取左邊第一個單詞
    mysql> SELECT SUBSTRING_INDEX(T.words,',',1) FROM word_table T ;
    +--------------------------------+
    | SUBSTRING_INDEX(T.words,',',1) |
    +--------------------------------+
    | apple                          |
    | computer                       |
    | laddy                          |
    +--------------------------------+
    3 rows in set (0.00 sec)mysql> -- 示例:取左邊二個單詞
    mysql> SELECT SUBSTRING_INDEX(T.words,',',2) FROM word_table T ;
    +--------------------------------+
    | SUBSTRING_INDEX(T.words,',',2) |
    +--------------------------------+
    | apple,orange                   |
    | computer,apple                 |
    | laddy,man                      |
    +--------------------------------+
    3 rows in set (0.00 sec)mysql> -- 示例:取右邊一個單詞,由此可以把每一個單詞都拿出來
    mysql> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',1),',',-1) FROM word_table T ;
    +--------------------------------------------------------+
    | SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',1),',',-1) |
    +--------------------------------------------------------+
    | apple                                                  |
    | computer                                               |
    | laddy                                                  |
    +--------------------------------------------------------+
    3 rows in set (0.00 sec)mysql> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',2),',',-1) FROM word_table T ;
    +--------------------------------------------------------+
    | SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',2),',',-1) |
    +--------------------------------------------------------+
    | orange                                                 |
    | apple                                                  |
    | man                                                    |
    +--------------------------------------------------------+
    3 rows in set (0.00 sec)
    

基本實現思路

  1. 計算單詞組字符串中的分隔符個數從而得出單詞個數(分隔符個數+1)。

    	-- 計算單詞個數,即分隔符的個數+1,便為單詞個數-- LENGTH:計算字符串中的字符個數-- REPLACE: 分換字符串中的字符,這里是將分隔符刪除SELECT words,(LENGTH(T.words) - LENGTH(REPLACE(T.words, ',',''))+1) AS wordsCount FROM word_table T
    
    +--------------------+------------+
    | words              | wordsCount |
    +--------------------+------------+
    | apple,orange,lemon |          3 |
    | computer,apple     |          2 |
    | laddy,man,woman    |          3 |
    +--------------------+------------+
    3 rows in set (0.00 sec)
    
  2. 根據單詞個數顯示查詢行數。

    	-- 借助mysql.help_topic表中的help_topic_id 進行關聯,進行拆分第一步-- help_topic_id 從0開始,固定數量的(和數據庫版本有關),我這里為0~699-- 示例:help_topic_id < 2,則符合條件的有0,1SELECT T.words FROM word_table T INNER JOIN mysql.help_topic H ON H.help_topic_id < (LENGTH(T.words) - LENGTH(REPLACE(T.words, ',',''))+1)
    
    +--------------------+
    | words              |
    +--------------------+
    | apple,orange,lemon |
    | apple,orange,lemon |
    | apple,orange,lemon |
    | computer,apple     |
    | computer,apple     |
    | laddy,man,woman    |
    | laddy,man,woman    |
    | laddy,man,woman    |
    +--------------------+
    8 rows in set (0.00 sec)
    
  3. 在該組的每一行,根據順序依次切割出單詞。

    第一次切割出一個,第二次切割出兩個,第三次切割出三個。

    	-- 通過 mysql.help_topic 的help_topic_id 序列ID來順序分割SELECT SUBSTRING_INDEX(T.words,',',H.help_topic_id+1) FROM word_table T INNER JOIN mysql.help_topic HON H.help_topic_id < (LENGTH(T.words)-LENGTH(REPLACE(T.words,',',''))+1)
    
    +------------------------------------------------+
    | SUBSTRING_INDEX(T.words,',',H.help_topic_id+1) |
    +------------------------------------------------+
    | apple                                          |
    | apple,orange                                   |
    | apple,orange,lemon                             |
    | computer                                       |
    | computer,apple                                 |
    | laddy                                          |
    | laddy,man                                      |
    | laddy,man,woman                                |
    +------------------------------------------------+
    8 rows in set (0.00 sec)
    
  4. 每行拿右邊第一個單詞即可。

    	-- 完整拆分操作SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',H.help_topic_id+1),',',-1) FROM word_table T INNER JOIN mysql.help_topic HON H.help_topic_id < (LENGTH(T.words)-LENGTH(REPLACE(T.words,',',''))+1)
    
    +------------------------------------------------------------------------+
    | SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',H.help_topic_id+1),',',-1) |
    +------------------------------------------------------------------------+
    | apple                                                                  |
    | orange                                                                 |
    | lemon                                                                  |
    | computer                                                               |
    | apple                                                                  |
    | laddy                                                                  |
    | man                                                                    |
    | woman                                                                  |
    +------------------------------------------------------------------------+
    8 rows in set (0.00 sec)
    

    參考博文

    https://www.jb51.net/database/305918jub.htm

    https://blog.csdn.net/qq_23845083/article/details/135410361

    https://www.lidihuo.com/mysql/mysql-string-substring_index-function.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15762.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java中創建不可變對象實現細節和例子

當我們在Java中創建不可變對象時&#xff0c;我們需要確保對象的狀態在創建之后不能被修改。以下是一些具體的實現細節和例子&#xff0c;展示了如何在Java中創建不可變對象。 實現細節 使用final關鍵字&#xff1a; 類定義前使用final關鍵字&#xff0c;表示該類不能被繼承&…

Mysql中的慢查詢

Mysql慢查詢的一些sql命令 慢查詢的默認事件為10秒 #注意&#xff1a;慢查詢一般是在調試階段開啟的&#xff0c;在開發階段中一般不會開啟&#xff0c;會對效率產生延誤 #查詢慢查詢是否開啟 show variables like %general%; #慢查詢時間設置 show variables like long_query…

【運維項目經歷|018】:Elasticsearch智能數據分析平臺項目

目錄 項目名稱 項目背景 項目目標 項目成果 我的角色與職責 我主要完成的工作內容 本次項目涉及的技術 本次項目遇到的問題與解決方法 本次項目中可能被面試官問到的問題 問題1&#xff1a;本次項目周期&#xff1f; 問題2&#xff1a;服務部署架構方式及數量和配置&…

【簡明指南:Python中的異常處理與穩健代碼設計】

文章目錄 前言異常處理基礎捕獲多種異常確保資源被釋放使用else子句自定義異常結論 前言 軟件開發過程中&#xff0c;保證代碼的穩健性和可靠性至關重要。異常處理是實現這一目標的關鍵技術之一。在Python編程中&#xff0c;合理地捕獲和處理異常不僅能提高程序的健壯性&#…

查找專利渠道

官方渠道 常規檢索 (cnipa.gov.cn)https://pss-system.cponline.cnipa.gov.cn/conventionalSearch 佰騰網 佰騰網 - 查專利就上佰騰網_佰騰全球專利搜索平臺_商標查詢平臺_企業工商信息查詢平臺 (baiten.cn)https://www.baiten.cn/

NLP(19)--大模型發展(3)

前言 僅記錄學習過程&#xff0c;有問題歡迎討論 大模型訓練相關知識&#xff1a; 問題&#xff1a; 數據集過大&#xff0c;快速訓練模型過大&#xff0c;gpu跑不完 方案&#xff1a; 數據并行訓練&#xff1a; 復制數據&#xff08;batch_size&#xff09;到多個gpu&…

簡述vue-router的動態路由

動態路由 addRoute 是 Vue Router 中的一個功能&#xff0c;它允許你在運行時動態地向路由表添加路由規則。這在一些需要基于用戶行為或異步數據加載路由的場景中非常有用。以下是對 addRoute 功能的詳細解釋和使用示例&#xff1a; 1. 動態路由的概念 動態路由是指在應用運行…

[雜項]優化AMD顯卡對DX9游戲(天諭)的支持

目錄 關鍵詞平臺說明背景RDNA 1、2、3 架構的顯卡支持游戲一、 優化方法1.1 下載 二、 舉個栗子&#xff08;以《天諭》為例&#xff09;2.1 下載微星 afterburner 軟件 查看游戲內信息&#xff08;可跳過&#xff09;2.2 查看D3D9 幀數2.3 關閉游戲&#xff0c;替換 dll 文件2…

精品PPT | MES設計與實踐,業務+架構+實施(免費下載))

【1】關注本公眾號&#xff0c;轉發當前文章到微信朋友圈 【2】私信發送 MES設計與實踐 【3】獲取本方案PDF下載鏈接&#xff0c;直接下載即可。 如需下載本方案PPT/WORD原格式&#xff0c;請加入微信掃描以下方案驛站知識星球&#xff0c;獲取上萬份PPT/WORD解決方案&#x…

linux的chmod的數字太難記了,用u, g, o, a更簡單!

u, g, o, 和 a是用來設置或查看文件或目錄權限在類Unix或Linux系統中的特殊字符&#xff0c;它們分別代表文件或目錄的所有者(user)、所屬組(group)、其他用戶(others)和所有用戶(all users)。 而權限方r和w是其中的兩種&#xff0c;分別代表讀權限&#xff08;read&#xff0…

【探索數據結構】線性表之單鏈表

&#x1f389;&#x1f389;&#x1f389;歡迎蒞臨我的博客空間&#xff0c;我是池央&#xff0c;一個對C和數據結構懷有無限熱忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;這里是我分享C/C編程、數據結構應用的樂園? &#x1f388;&#x1f388;&…

Autodl服務器中Faster-rcnn(jwyang)復現(一)

前言 在做實驗時需要用到faster-rcnn做對比,本節首先完成代碼復現,用的數據集是VOC2007~ 項目地址:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 復現環境:autodl服務器+python3.6+cuda11.3+Ubuntu20.04+Pytorch1.10.0 目錄 一、環境配置二、編譯cud…

2024年軟考總結 信息系統管理師

選擇題 英文題&#xff0c;我是一題也沒把握&#xff0c;雖然我理解意思。 千萬不要認為考死記硬背不對。目的不在于這。工程項目中有很多重要的數字&#xff0c;能記住說明你合格。 案例 幾乎把答案全寫在案例中了。 計算題 今年最簡單。沒有考成本。 只考了關鍵路徑&a…

頭歌OpenGauss數據庫-I.復雜查詢第8關:兩門及以上課程不及格的學生

任務描述 本關任務:根據提供的表和數據,查詢兩門及其以上不及格課程的同學的學號(s_id)、姓名(s_name)及其平均成績(avg_score),要求計算平均成績后為整數。 student表數據: s_ids_names_sex01Mia女02Riley男03Aria女04Lucas女05Oliver男06Caden男07Lily女08Jacob男c…

安卓開發:相機水印設置

1.更新水印 DecimalFormat DF new DecimalFormat("#"); DecimalFormat DF1 new DecimalFormat("#.#");LocationManager LM (LocationManager)getSystemService(Context.LOCATION_SERVICE); LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2…

【學習筆記】計算機組成原理(七)

指令系統 文章目錄 指令系統7.1 機器指令7.1.1 指令的一般格式7.1.2 指令字長 7.2 操作數類型和操作類型7.2.1 操作數類型7.2.2 數據在存儲器中的存放方式7.2.3 操作類型 7.3 尋址方式7.3.1 指令尋址7.3.1.1 順序尋址7.3.1.2 跳躍尋址 7.3.2 數據尋址7.3.2.1 立即尋址7.3.2.2 直…

第四十五天 | 322.零錢兌換

題目&#xff1a;322.零錢兌換 嘗試解答&#xff1a; 1.確定dp[j]含義&#xff1a;裝滿容量為j的背包所需要放的硬幣個數為dp[j]; 2.動態轉移方程&#xff1a;dp[j] dp[j - coins[i]] 1; 3.遍歷順序&#xff1a;本題應該為組合類題目&#xff0c;不考慮裝入的順序&#x…

精品PPT | 精益生產管理中MES系統的實現與應用(免費下載)

【1】關注本公眾號&#xff0c;轉發當前文章到微信朋友圈 【2】私信發送 MES系統的實現與應用 【3】獲取本方案PDF下載鏈接&#xff0c;直接下載即可。 如需下載本方案PPT/WORD原格式&#xff0c;請加入微信掃描以下方案驛站知識星球&#xff0c;獲取上萬份PPT/WORD解決方案&…

吃掉 N 個橘子的最少天數(Lc1553)——記憶化搜索

廚房里總共有 n 個橘子&#xff0c;你決定每一天選擇如下方式之一吃這些橘子&#xff1a; 吃掉一個橘子。如果剩余橘子數 n 能被 2 整除&#xff0c;那么你可以吃掉 n/2 個橘子。如果剩余橘子數 n 能被 3 整除&#xff0c;那么你可以吃掉 2*(n/3) 個橘子。 每天你只能從以上 …

Redis - 緩存場景

學習資料 學習的黑馬程序員嗶站項目黑馬點評&#xff0c;用作記錄和探究原理。 Redis緩存 緩存 &#xff1a;就是數據交換的緩沖區&#xff0c;是存儲數據的臨時地方&#xff0c;讀寫性能較高 緩存常見的場景: 數據庫查詢加速&#xff1a;通過將頻繁查詢的數據緩存起來&…