Excel公式批量拼接SQL


目录
  • 字段去格式
  • 拼create字段
  • 拼insert字段
  • 拼select字段
    • Excel函数扩展

写建表语句或者查询语句,手写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()是区分大小写的。

  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官网帮助文档