Mysql字符串切分的處理
前段時間做了一個對於字符串的切分,對於網頁爬取的數據或者不規范的數據來源,常常會有這種需求。
由於在處理的過程中,sql語句中對字符串的出里函數以及方法不太了解,走了不少彎路。
這里記錄一下。
Mysql 對字符串解切分處理,主要用到了4個函數,
SUBSTRING_INDEX(str,delim,count)
Str 是要處理字符串,
Delim是切分字符如:’,’
Count 是截取的字段數,如3,截取第三個,前的字段
這是一個很有趣的函數,當你的count,但你的count給到足夠大了時候它不起任何作用,不如其他語言中的split()那么好用。
SUBSTRING(str,pos)
Str 字符串源,
Pos 開始截取的位置,pos可以為負,表示從后開始計數的位置。
CHAR_LENGTH(str)
REPLACE(str,from_str,to_str)
REPLACE(SUBSTRING(SUBSTRING_INDEX(`major_tax_violatio`,',',i),CHAR_LENGTH(SUBSTRING_INDEX(`major_tax_violatio`,',',i-1))+1),',','')
用來獲取兩個’,’分隔符之間的數據。
由於mysql沒有在一行數據做出循環,或者保存數據辦法(我不知道),所以我們能夠控制截取的結果的只有count,以及where匹配。
這里我使用的是count++的方式,第一次截取所有的第一個’,’前的數據,第二次截取第二個’,’與第一個’,’之間的字符
where
SUBSTRING(SUBSTRING_INDEX(major_tax_violatio,',',i),CHAR_LENGTH(SUBSTRING_INDEX(major_tax_violatio,',',i-1))+1) regexp 'public_date' 使用正則表達式來篩選。
對於循環的跳出條件
- 當所有的元組的該字段都已經匹配上了(用一個rows+=ROW_COUNT(),來累加update的元組之和等於所有元組數)
- 當一個所有的已經匹配完畢(所有的,分割符分割的內容都已經匹配到了),但是有部分元組沒有匹配到我們想要的數據。
--REPLACE(SUBSTRING(SUBSTRING_INDEX(`major_tax_violatio`,',',i),CHAR_LENGTH(SUBSTRING_INDEX(`major_tax_violatio`,',',i-1))+1),',','')
寫入一個tmp表中,當這個表的所有字段都為null,或者’’時表示改字段已經匹配完畢。
