res_vod = db.execute("""
SELECT CAST ((SUM(r.SalesVolume)/1000.0) AS decimal(6,1))
FROM RawData r
INNER JOIN Product p
ON r.ProductId = p.ProductId
INNER JOIN Calendar c
ON r.DayId = c.DayId
WHERE c.WeekCodeInYear BETWEEN 30 AND 50
AND p.VODEST IN ('VOD')
AND p.Distributor IN ({})
GROUP BY c.WeekCodeInYear
ORDER BY c.WeekCodeInYear""".format(', '.join(["'" + studio + "'" for studio in _studios])) )
上面的代码允许我添加一个列表作为查询的参数。但是我的要求是添加多个参数。
在上面的代码中,_studios
是包含参数的列表。
_studios = ["WARNER","TF1","GAUMONT","PATHE","STUDIOCANAL","FRANCETV","M6SND"]
我有另一个列表,如:
_vodest = ["VOD","EST"]
我想在查询中将其添加为p.VODEST
的参数。
我可以使用%
轻松完成此操作,但必须注意该列表包含双引号("WARNER")
,但SQL查询需要单引号('WARNER')
答案 0 :(得分:2)
def placemarks(n):
return ','.join(['%s']*n)
sql = """SELECT CAST ((SUM(r.SalesVolume)/1000.0) AS decimal(6,1))
FROM RawData r
INNER JOIN Product p
ON r.ProductId = p.ProductId
INNER JOIN Calendar c
ON r.DayId = c.DayId
WHERE c.WeekCodeInYear BETWEEN 30 AND 50
AND p.VODEST IN ({})
AND p.Distributor IN ({})
GROUP BY c.WeekCodeInYear
ORDER BY c.WeekCodeInYear""".format(
placemarks(len(_vodest)),
placemarks(len(_studios)))
args = [_vodest + _studios]
res_vod = db.execute(sql, args)