最近一段时间经常要写一些联合查询的逻辑,同时要满足逻辑a,b,c或是其中一种,写起来很是麻烦.
有一天突然想到一个简单方法,将每一个子句先放置于list中,然后将list中的子句用" and "拼接起来,最外层判断list是否为空,不为空在最前面加上"where "的条件头即可.

例子:

有一个请求任务,其中有2个请求字段:
status_code:为空字符串,表示请求全部状态,为"8"表示全部成功,为"-4"表示在黑名单中
symbol:为空表示所有合约,或者表示具体的合约名

首先申明一个list为空
s_list = list()
然后判断如果symbol为真,则将其加入到list中
if symbol:
s_list.append(“symbol=’{}’”.format(symbol))
再判断如果status_code为真,也将其加入到list中
if status_code:
s_list.append(“status_code={}”.format(status_code))
在外层判断list的状态,为真则where子句存在,否则where子句为空字符串
if s_list:
where_sub_sql = "where " + " and ".join(s_list)
else:
where_sub_sql = “”

完整代码片段如下:

s_list = list()
if symbol:
    s_list.append("symbol='{}'".format(symbol))
if status_code:
    s_list.append("status_code={}".format(status_code))
if s_list:
    where_sub_sql = "where " + " and ".join(s_list)
else:
    where_sub_sql = ""