列轉行:利用max(case when then)
成都創(chuàng)新互聯公司是一家專注于成都做網站、網站設計與策劃設計,垣曲網站建設哪家好?成都創(chuàng)新互聯公司做網站,專注于網站建設十年,網設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:垣曲等地區(qū)。垣曲做網站價格咨詢:18980820575
`max``---聚合函數 取最大值`
`(`case course when '語文' then score else 0 end ) ---判斷`
` as 語文``---別名作為列名`
mysql查詢含逗號的數據,將逗號拆分為多行展示:
原始數據如下:
現在因為新的需求,需要將這些數據轉化為如下形式:
假設我們需要處理的表結構為:
使用如下sql語句即可實現需求:
查詢的主要思路為,原表與一個包含連續(xù)自增長字段的表進行join,得到字符串分隔后的索引值,其中 length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1 語句獲得字符串逗號分隔之后得到的數據長度,兩表關聯之后,會得到相應行數的數據。比如,
在join之后會得到:
之后對查詢中的結果,使用substring_index方法進行截取,然后得到我們自己想要的數據。
import_table(importTable) 的延申功能:可定制化行輸入。
import_table(importTable) 我們之前有介紹過,是一款并行導入各種格式文本的工具,封裝了 MySQL 語句?load data local infile。
比如說要導入一個以 TAB 為分隔符的文本數據文件:/tmp/sample_ytt.txt?到表:ytt_new.t1,可以執(zhí)行下面語句:
上面結果是?load data infile?語句的導入結果。如果改用 import_table 方法來做同樣的事情,基于 Python 語法,使用方法如下:
那接下來看另外一個需求:在導入文本文件時對每行做預處理(例如在導入數據之前更改列 r2 的值為 mod(r1,10),列 r5 的值為 abs(r4-46) ),這樣可以減少導入后再次處理的時間開銷。
這個需求用?load data infile?語句非常容易實現:(導入時更改列 r2 和 r5 的數據,類似 UPDATE 語法)
那如果要用 util.import_table(importTable) 來實現上面的需求,在 MySQL 8.0.22 之前是沒辦法的。
隨著 MySQL 8.0.22 的發(fā)布,MySQL 對 import_table 方法做了些擴充功能,其中增加了一個選項 “decodeColumns” 可以實現字段的預先輸入定制化功能,并且還可以更加豐富。
接下來用 import_table 來實現上面的需求,定制化字段 r2 和 r5:
以上 Options 選項,見下圖:
我來具體解釋下上圖的含義:藍色字體 columns 對應的數組分別指定數據文件中的每行字段,也就是默認的 TAB 分隔符所分割的每列值,1 和 2 代表占位符,1 代表數據文件中每行的第一個列,2 代表數據文件中每行的第四列,decodeColumns 字典分別對需要預先輸入的字段做處理。比如 r1 字段保留為變量 @1,r2 字段對應 mod(r1,10) 等。
如果還是不太理解變換規(guī)則,可以臨時打開 general log, 上面 import_table(importTable)對應的 MySQL 日志為:
以上日志寫的很清楚,內部轉換為最基本的load data infile語法。
那這里我簡單解讀了下 MySQL 8.0.22 對 MySQL Shell 的一項定制化輸入文本文件的新特性,更多的新特性可以繼續(xù)關注。