寫建表語句或者查詢語句,手寫SQL難免格式出錯,尤其是字段很多的時候。
於是面對大批量開發任務時,為了減少手寫帶來的小錯誤,一些公司會用自家研發的小工具,協助開發,一般只需要配置相關的表信息與字段信息,就會批量生成建表語句與查詢語句。遺憾的是,市場上還沒有通用的SQL開發小工具。
實際上在沒有這些小工具的時候,我們也可以用Excel來協助我們開發,操作也非常簡單。下面提供一些Excel拼接SQL的思路,希望對大家有幫助。
字段去格式
在Excel中復制字段時,可能出現字段前后有空格,一個單元格里拼接多行(實際上需要多行合為一行顯示)等問題。
- 用
TRIM()
去除空格 - 用
CLEAN()
去除換行符
拼接內容:
字段 | 清除空格 | 清除格式 |
---|---|---|
NM | =TRIM(A2) |
=CLEAN(B2) |
01_clean sheet頁
拼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頁
拼接效果
具體運用
拼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頁
拼接效果
具體運用
拼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頁
拼接效果
插入語句運用
用到的函數:
SEARCH()
返回查找的字符在字符串中的位置ISNUMBER()
檢測參數是否為數值,返回 ture 或 false
Excel函數擴展
ISNUMBER()
具體應用
FIND()
與SEARCH()
作用相同,SEARCH()
是模糊查找,不區分大小寫,FIND()
是區分大小寫的。
- 判斷單元格中是否包含多個指定字符中的某一個,如判斷單元格中是否包含“CHAR”、“STRING”、“20”這三個字符中的一個,可用公式
=IF(OR(ISNUMBER(SEARCH({"CHAR";"STRING";"20"},A1))),"有","無")
- 而要判斷是否同時包含這三個字符,只要把公式中的OR改成AND即可
=IF(AND(ISNUMBER(SEARCH({"CHAR";"STRING";"20"},A1))),"有","無")
- 判斷單元格中是否包含字母A,且不論在字符串的什么位置,也不區分大小寫
=IF(COUNTIF(A1,"*A*"),"有","無")
- 判斷四個字符中是否以字母A開頭
=IF(COUNTIF(A1,"A???"),"有","無")
或者=IF(COUNTIF(A1,"A*"),"有","無")
參考資料: