說明
有時候我們在維護數據庫時,需要編寫SQL腳本批量導入數據庫(尤其是在項目上線初期),比如業務給了一個Excel文檔(成千上萬條數據的那種),要你導入數據庫,當然你可以通過寫代碼來讀取Excel文檔進行導入,不過這種需求可能是一次性的,用一次後面就不用了,寫代碼成本太高。因此直接通過Excel函數來生成腳本更省事。
幾個常用的Excel函數
-
IF()函數
該函數使用方式和MySQL中的if()函數一樣,可以嵌套使用。
IF(<條件表達式>, <滿足條件後的返回值>, <不滿足條件的返回值>) -
SUBSTITUTE()函數
字符串替換函數,返回替換後的值。
SUBSTITUTE(<原始字符串>,<被替換的字符>,<替換後的字符>) -
CLEAN()函數
清空不可見字符。
如回車、換行、TAB鍵、不可見的雙引號等。
由於Excel複製單元格時,如果單元格內容是字符類型,則會複製後再粘貼到文本文檔中會自動添加雙引號,可以通過這個函數去掉雙引號。 -
TRIM()函數
去空格函數 -
幾個特殊符號
&
字符串拼接符號,如:A1&“hello你好”, A1是一個單元格引用。
$
絕對定位符號,$A1,$A$1。 使用絕對定位符後,在做Excel拖拉複製操作時單元格的引用不會隨位置變化而變化。
批量生成SQL腳本
- 先寫一個sql示例模板,這裏的 @field_name 、@field_value 、@pkg_id 、@seq 是佔位符,需要替換的。
update t_test
set @field_name='@field_value'
WHERE package_id=@pkg_id and sequence = @seq
;
- 準備如下Excel
A1單元格:輸入固定值5,用於替換佔位符@pkg_id,當然這個值是需要根據具體需求修改的。
B1單元格:輸入上面的SQL模板。
我們要處理的數據是從第3行開始:
E3單元格:=IF(CLEAN(TRIM(B3))="模式識別能力","recognition_ability",IF(CLEAN(TRIM(B3))="抽象思維能力","abstract_ability",""))
根據B3單元格的值獲取更新的字段名。
F3單元格:=SUBSTITUTE($B$1,"@field_name",E3)
B1爲sql模板,該函數替換模板中的@field_name爲E3中計算出來的字段名,由於B1是固定的因此用絕對引用$B$1。
G3單元格:=SUBSTITUTE(F3,"@field_value",C3)
替換sql模板中的@field_value爲C3的值。
H3單元格:=SUBSTITUTE(G3,"@pkg_id",$A$1)
替換sql模板中的@pkg_id爲A1的值,由於A1是固定的,因此用絕對引用$A$1。
I3單元格:=SUBSTITUTE(H3,"@seq",D3)
替換sql模板中的@seq爲D3的值。
J3單元格:=CLEAN(I3)
清空I3單元格值中的不可見字符得到最終結果。
I3計算後的值如下:
"update course_lesson
set recognition_ability='excel測試內容001'
WHERE package_id=5 and `sequence` = 4
;"
J3計算後的值如下:(已經去掉了回車、最外層的雙引號等字符)
update course_lesson set recognition_ability='excel測試內容001' WHERE package_id=5 and `sequence` = 4 ;
-
要批量生成後面的sql,只需選中需要複製的區域,然後將表格往下拉去自動填充即可。
如果有成千上萬行數據你可不能這麼往下拉,那要拉到何年何月去,你可以用快捷鍵:
(1)首先選中要填充的區域:如用選中E3單元格,然後按住shift鍵不鬆開,再點擊J100,最後鬆開shift鍵,這樣從E3到J100對角線的整個方形區域就被選中了(或者直接按ctrl + shift + 下箭頭
從當前選擇的區域到Excel最後一行全部選中)。
(2)然後自動填充所選區域:ctrl + d
。
如果是Mac,將ctrl換成command即可 -
最後將【最終結果】這一列全部複製,粘貼到文本格式中即可
update course_lesson set recognition_ability='excel測試內容001' WHERE package_id=5 and `sequence` = 4 ;
update course_lesson set abstract_ability='excel測試內容002' WHERE package_id=5 and `sequence` = 4 ;
update course_lesson set abstract_ability='excel測試內容003' WHERE package_id=5 and `sequence` = 5 ;
update course_lesson set recognition_ability='excel測試內容004' WHERE package_id=5 and `sequence` = 5 ;
update course_lesson set recognition_ability='excel測試內容006' WHERE package_id=5 and `sequence` = 6 ;
update course_lesson set recognition_ability='excel測試內容007' WHERE package_id=5 and `sequence` = 7 ;
update course_lesson set abstract_ability='excel測試內容008' WHERE package_id=5 and `sequence` = 7 ;
當然你也可以不使用sql模板佔位符的方式,直接用&
符號將sql片段拼接起來,
但是如果sql太長你會頭暈的。 拼接示例如下:
="update t_test set "&IF(CLEAN(TRIM(B3))="模式識別能力","recognition_ability",IF(CLEAN(TRIM(B3))="抽象思維能力","abstract_ability",""))&"='"&C3&"' WHERE package_id="&$A$1&" and sequence = "&D3&";"
真實的業務數據格式遠比這個示例要複雜,但是你可以通過這種方法進行擴展基本都能實現,實在不行就只能使出程序員的殺手鐗了——show me the code。