Excel公式批量拼接SQL



寫建表語句或者查詢語句,手寫SQL難免格式出錯,尤其是字段很多的時候。

於是面對大批量開發任務時,為了減少手寫帶來的小錯誤,一些公司會用自家研發的小工具,協助開發,一般只需要配置相關的表信息與字段信息,就會批量生成建表語句與查詢語句。遺憾的是,市場上還沒有通用的SQL開發小工具。

實際上在沒有這些小工具的時候,我們也可以用Excel來協助我們開發,操作也非常簡單。下面提供一些Excel拼接SQL的思路,希望對大家有幫助。

字段去格式

在Excel中復制字段時,可能出現字段前后有空格,一個單元格里拼接多行(實際上需要多行合為一行顯示)等問題。

  • TRIM()去除空格
  • CLEAN()去除換行符

拼接內容:

字段 清除空格 清除格式
NM =TRIM(A2) =CLEAN(B2)

01_clean sheet頁
image

拼create字段

util.dropTable(RMLDB+'.'+TABLE_NAME)

sql= r'''
CREATE TABLE IF NOT EXISTS $RMLDB$.$TABLE_NAME$(
     TB_ID                         VARCHAR(48)               COMMENT '表格編號'      -- 02
    ,NM                            VARCHAR(75)               COMMENT '名稱'          -- 03
    ,AMT                           DECIMAL(24,6)             COMMENT '金額'          -- 04
    ,TXN_SRC                       VARCHAR(12)               COMMENT '交易來源'      -- 05
)
PARTITIONED BY (
DATA_DT VARCHAR(10) COMMENT '數據日期'
)
COMMENT '基礎信息表'
STORED AS PARQUET
'''

util.execSql(sql, locals())
  • IF()判斷字段長度是否超長
  • REPT()在字段后拼接空格,將字段與空格看作一整體,使其長度為固定值

拼接內容:

字段 字段類型 字段中文 pin字段 pin字段類型 pin全部
TB_ID VARCHAR(48) 表格編號 =IF(LEN(A2)<30,A2&REPT(" ",30-LEN(A2)),LEN(A2)) =IF(LEN(B2)<25,B2&REPT(" ",25-LEN(B2)),LEN(B2)) =" ,"&D2&E2&" COMMENT '"&C2&"'"
  • pin字段=IF(LEN(A2)<30,A2&REPT(" ",30-LEN(A2)),LEN(A2)),如果A2中的字段長度小於30,則拼接該字段與空格,保持字段與空格兩者作為整體的長度為30,如果字段長度大於等於30,則返回長度值
  • pin全部=" ,"&D2&E2&" COMMENT '"&C2&"'"將拼好的字段與字段類型,加上字段中文3者合在一起

02_create sheet頁
image

拼接效果
image

具體運用
image

拼insert字段

INSERT OVERWRITE $RMLDB$.$TABLE_NAME$
(
 TB_ID   -- 01 表格編號
,NM      -- 02 名稱
)
PARTITION(DATA_DT = CAST($bizDate10$ AS VARCHAR(10)))
SELECT
CAST(COALESCE(T1.TB_ID,    '') AS VARCHAR(48))   AS TB_ID      -- 01 表格編號
,CAST(COALESCE(T1.NM,      '') AS VARCHAR(75))   AS NM         -- 02 名稱
FROM $SHDATADB$.表名 T1
WHERE T1.DATA_DT = '$bizDate10$'

拼接內容:

編號 字段 字段中文 拼"," 字段對齊pin pin中文注釋 pin全部
01 NM 名稱 =","&B2 =" "&IF(LEN(D2)<35,D2&REPT(" ",35-LEN(D2)),LEN(D2)) ="-- "&A2&" "&C2 =E2&F2

03_insert sheet頁
image

拼接效果
image

具體運用
image

拼select字段

INSERT OVERWRITE $RMLDB$.$TABLE_NAME$
(
     TB_ID                             -- 02 表格編號
    ,NM                                -- 03 名稱
    ,AMT                               -- 04 金額
    ,TXN_SRC                           -- 05 交易來源
)
PARTITION(DATA_DT = CAST($bizDate10$ AS VARCHAR(10)))
SELECT
     CAST(COALESCE(T1.TB_ID_OLD,                         '') AS VARCHAR(48))                  AS TB_ID                         --02 表格編號
    ,CAST(COALESCE(T1.NAME_OLD,                          '') AS VARCHAR(75))                  AS NM                            --03 名稱
    ,CAST(COALESCE(T1.AMT_OLD,                            0) AS DECIMAL(24,6))                AS AMT                           --04 金額
    ,CAST(COALESCE(T1.TXN_SRC_OLD,                       '') AS VARCHAR(12))                  AS TXN_SRC                       --05 交易來源
FROM $SHDATADB$.表名 T1
WHERE T1.DATA_DT = '$bizDate10$'

拼接內容:

編號 字段類型 源表字段 目標表字段 目標表字段中文 拼"," 字段對齊pin 字段類型拼")" 字段類型對齊pin 目標字段對齊pin 目標字段中文注釋對齊pin coalesce默認值pin pin全部 固定部分
01 VARCHAR(75) NM NM 名稱 =C2&"," =IF(LEN(F2)<35,F2&REPT(" ",35-LEN(F2)),LEN(F2)) =B2&")" =IF(LEN(H2)<20,H2&REPT(" ",20-LEN(H2)),LEN(H2)) =IF(LEN(D2)<30,D2&REPT(" ",30-LEN(D2)),LEN(D2)) ="--"&A2&" "&E2 =IF(OR(ISNUMBER(SEARCH({"CHAR","STRING"},B2))),"'')"," 0)") =$N$2&G2&L2&" AS "&I2&"AS "&J2&K2 ,CAST(COALESCE(T1.

04_select sheet頁
image

image

拼接效果
image

插入語句運用
image

用到的函數:

  • SEARCH()返回查找的字符在字符串中的位置
  • ISNUMBER()檢測參數是否為數值,返回 ture 或 false

Excel函數擴展

  • ISNUMBER()具體應用

FIND()SEARCH()作用相同,SEARCH()是模糊查找,不區分大小寫,FIND()是區分大小寫的。

  1. 判斷單元格中是否包含多個指定字符中的某一個,如判斷單元格中是否包含“CHAR”、“STRING”、“20”這三個字符中的一個,可用公式=IF(OR(ISNUMBER(SEARCH({"CHAR";"STRING";"20"},A1))),"有","無")
  2. 而要判斷是否同時包含這三個字符,只要把公式中的OR改成AND即可=IF(AND(ISNUMBER(SEARCH({"CHAR";"STRING";"20"},A1))),"有","無")
  3. 判斷單元格中是否包含字母A,且不論在字符串的什么位置,也不區分大小寫=IF(COUNTIF(A1,"*A*"),"有","無")
  4. 判斷四個字符中是否以字母A開頭=IF(COUNTIF(A1,"A???"),"有","無")或者=IF(COUNTIF(A1,"A*"),"有","無")

參考資料:

  1. 判斷字符串中是否具有某些字符
  2. Excel官網幫助文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM