如下的查询:
query = "SELECT user_id FROM users WHERE lang = %s ORDER BY CASE WHEN %s <> NULL THEN location <-> %s ELSE RANDOM() END LIMIT 1"
query(query, lang, location, location)
可以写成(使用python):
location = ...
order = "RANDOM()" if location is None else "location <-> %s"
order_args = [] if location is None else [location]
query = "SELECT user_id FROM users WHERE lang = %s ORDER BY "+order+" LIMIT 1"
query(query, lang, *order_args)
为什么在这种情况下应该使用“CASE”sql,当它可以做这样的事情时,从sql注入安全并保持查询非常干净? 是否有一些专业和控制?
如果查询中有更多CASE,它可能是一个更清洁的解决方案。
答案 0 :(得分:1)
动态构建查询是一种合理的策略,只要您注意SQL注入即可。但是,通常更容易让数据库引擎完成工作。数据库引擎可以根据具体情况缓存查询并为您做其他有用的事情。
您必须使用动态查询的唯一时间是变量部分是数据库引擎不会被视为变量的东西,如模式和对象名称,或整个子句的存在/不存在(ORDER BY,LIMIT)等等)。其余的时间,它的个人品味/判断力。