注冊|登錄

聯系電話:024-31891684  13390130939
沈陽軟件公司--沈陽軟件定制

沈陽軟件開發_沈陽軟件公司_沈陽軟件定制/軟件/最新技術

Latest technology最新技術

MySQL逗號分割字段的行列轉換技巧

瀏覽量:2753

前言:

由于很多業務表因為歷史原因或者性能原因,都使用了違反第一范式的設計模式。即同一個列中存儲了多個屬性值(具體結構見下表)。

這種模式下,應用常常需要將這個列依據分隔符進行分割,并得到列轉行的結果。

表數據:

 

ID 

Value

1

tiny,small,big

2

small,medium

3

tiny,big

期望得到結果:

 

ID

Value

1

tiny

1

small

1

big

2

small

2

medium

3

tiny

3

big

正文:

 

#需要處理的表

createtable tbl_name (ID int ,mSize varchar(100));

insertinto tbl_name values (1,'tiny,small,big');

insertinto tbl_name values (2,'small,medium');

insertinto tbl_name values (3,'tiny,big');

 

#用于循環的自增表

createtable incre_table (AutoIncreID int);

insertinto incre_table values (1);

insertinto incre_table values (2);

insertinto incre_table values (3);

 

 

selecta.ID,substring_index(substring_index(a.mSize,',',b.AutoIncreID),',',-1)

from

tbl_name a

join

incre_table b

onb.AutoIncreID <= (length(a.mSize) - length(replace(a.mSize,',',''))+1)

orderby a.ID;

 

原理分析:

這個join最基本原理是笛卡爾積。通過這個方式來實現循環。

以下是具體問題分析:

length(a.Size) - length(replace(a.mSize,',',''))+1 表示了,按照逗號分割后,改列擁有的數值數量,下面簡稱n

join過程的偽代碼:

根據ID進行循環

{

判斷:i 是否<= n

{

獲取最靠近第i 個逗號之前的數據,即substring_index(substring_index(a.mSize,',',b.ID),',',-1)

i = i +1

}

ID = ID +1

}

總結:

這種方法的缺點在于,我們需要一個擁有連續數列的獨立表(這里是incre_table)。并且連續數列的最大值一定要大于符合分割的值的個數。

例如有一行的mSize 有100個逗號分割的值,那么我們的incre_table 就需要有至少100個連續行。

當然,mysql內部也有現成的連續數列表可用。如mysql.help_topic:help_topic_id 共有504個數值,一般能滿足于大部分需求了。

改寫后如下:

 

selecta.ID,substring_index(substring_index(a.mSize,',',b.help_topic_id+1),',',-1)

from

tbl_name a

join

mysql.help_topic b

onb.help_topic_id < (length(a.mSize) - length(replace(a.mSize,',',''))+1)

orderby a.ID;

沈陽團購網|營口網站制作|沈陽軟件公司|軟件定制|網站建設|加盟易勢|提交問題

主站蜘蛛池模板: 免费在线看黄网站| 男人的j进女人视频| 国产精品午夜国产小视频| 一个人看的视频在线| 日本无卡无吗在线| 亚洲三级在线视频| 清纯秘书被总经理吸乳小说| 午夜看一级特黄a大片| 野花社区在线观看www| 国产福利在线小视频| 91视频app污| 天天看天天摸天天操| 中国一级毛片视频| 日本漂亮人妖megumi| 亚洲一区免费视频| 欧美老人巨大xxxx做受视频| 免费乱理伦片在线直播| 美女18毛片免费视频| 国产产无码乱码精品久久鸭| 欧美另类xxxx图片| 国产精品无码素人福利不卡| 99精品久久99久久久久| 好硬好爽好湿好深视频| 中文国产成人精品久久app| 无遮挡边吃摸边吃奶边做| 久久夜色精品国产欧美乱| 最新版天堂中文在线| 亚洲午夜精品久久久久久人妖| 污污动漫在线看| 俺去啦在线观看| 精品久久久久久| 午夜精品久久久久久| 羞羞社区在线观看视频| 国产一级伦理片| 超级色的网站观看在线| 国产在线公开视频| 99精品众筹模特私拍在线| 国产欧美综合一区二区三区| 手机看片你懂的| 国产精品免费看久久久无码| 4hu永久影院在线四虎|