nodejs中where条件sql语句的字符串拼装

nodejs中where条件sql语句的字符串拼装

使用需求

使用nodejs操作数据库时需要拼装各种sql语句字符串,当然你也可以使用各种orm框架,但学习成本比较高,针对一般的业务,自己封装一些常用的拼装sql工具足以应付。
下面讨论一下拼装where条件语句时的情况。

直接的处理方式

通常复杂一点的查询都会有多个where条件,并且各个条件有可能传也可能不传,比如说有两个条件的情况:

function createSql(search,state) {
	let sql = ''
	if (search !== undefined && state === undefined) {
		sql = `where mac LIKE '%${search}%'`
	}else if (search === undefined && state !== undefined) {
		sql = `where state=${state}`
	}else if (search !== undefined && state !== undefined) {
		sql = `where mac LIKE '%${search}%' and state=${state}`
	}
	return sql
}

两个条件写了这么长,三个条件就。。。

封装成工具函数

封装成工具函数时一定要考虑其通用性,但是也要保证输入的参数是一个最简化的个体,满足使用需求即可,参数过于复杂就会让人很困惑,也失去了封装的意义。
最重要的还是抽象能力,写程序时经常听大神说要有抽象能力,可是自己始终就是处于一知半解的状态。这种情况下,必须抽象出一些规律来,不然按照常规方式写,就把自己坑死了。
经过思考,主要难点就是where和and拼接的时机,经过抽象,其实不管多少个参数,只有三种情况:

function createSql (search,state,projectId) {
    let sqlSearch = `mac LIKE '%${search}%'`
    let sqlState = `state=${state}`
    let sqlProject = `projectId=${projectId}`
    let whereArr = [
        {val: search, sql: sqlSearch},
        {val: state, sql: sqlState},
        {val: projectId, sql: sqlProject}
    ]
    let sqlWhere = createSqlWhere(whereArr)
    let sql = `SELECT * FROM robot ${sqlWhere?sqlWhere:''} limit 0,10;`
    return sql
}

function createSqlWhere(arr) {
    let sql = ''
    let _arr1 = arr.map(v => v.val)
    let _arr = _arr1.filter(v=> {
        let bool = !!v    //这里有坑,传0会被过滤掉
        return bool != false
    })
    if (_arr.length === 1) {
        arr.forEach((v) => {
            if (v.val) {
                sql = `where ${v.sql}`
            }
        })
    } else if (_arr.length > 1) {
        let state = true
        arr.forEach((v) => {
            if (v.val && state) {
                sql = `where ${v.sql}`
                state = false
            } else if (v.val && !state) {
                sql += ` and ${v.sql}`
            }
        })
    }
    return sql
}

抽象过后的三种情况:
1.参数全空
2.只有一个参数
3.有多个参数
参数全空可以不用写,直接return出去就行,所以其实就只有两种情况。

这样一个通用的工具函数就写完了,在哪里都可以开心的使用了。
此函数没有写or语句,还有个小坑,自己动手改造,才能提高哦。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值