为什么使用 CASE WHEN 而不是编程语言控制语句?

why using CASE WHEN instead of programming language control statements?

查询如:

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,它可能是一个更简洁的解决方案。

动态构建查询是一种合理的策略,只要您注意 SQL 注入。然而,让数据库引擎完成工作通常更容易。数据库引擎可能能够缓存查询并为您做其他有用的事情,具体取决于具体情况。

唯一必须使用动态查询的情况是当变量部分是数据库引擎不会将其视为变量的内容时,例如模式和对象名称,或者整个子句的存在/不存在(ORDER BY、LIMIT等等)。其他时间看个人口味/判断。