Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么使用CASE代替编程语言控制语句?_Python_Sql_Postgresql_Case_Statements - Fatal编程技术网

Python 为什么使用CASE代替编程语言控制语句?

Python 为什么使用CASE代替编程语言控制语句?,python,sql,postgresql,case,statements,Python,Sql,Postgresql,Case,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) query=“从用户中选择用户\u id,其中lang=%s按大小写排序,当%s为空时,然后选择位置%s ELSE RA

类似以下的查询:

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)
query=“从用户中选择用户\u id,其中lang=%s按大小写排序,当%s为空时,然后选择位置%s ELSE RANDOM()结束限制1”
查询(查询、语言、位置、位置)
可以编写为(使用python):

位置=。。。
order=“RANDOM()”如果位置不是其他位置,则为“位置%s”
order_args=[]如果位置不是其他位置[位置]
query=“从lang=%s ORDER BY”+ORDER+“LIMIT 1”的用户中选择用户\u id”
查询(查询,lang,*order_参数)
在这种情况下,为什么要使用“case”sql,而这样做是可能的,可以避免sql注入并保持查询非常干净? 有赞成和反对的吗


如果查询中有更多的情况,那么它可能是一个更干净的解决方案。

动态构建查询是一个不错的策略,只要您小心SQL注入。但是,让数据库引擎来完成这项工作通常比较容易。根据具体情况,数据库引擎可能能够缓存查询并为您执行其他有用的操作


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

动态构建查询是一个不错的策略,只要您对SQL注入非常小心。但是,让数据库引擎来完成这项工作通常比较容易。根据具体情况,数据库引擎可能能够缓存查询并为您执行其他有用的操作


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

数据库可以更快地按进行排序。特别是,此查询的原始版本仅返回1行。不在数据库和应用程序之间进行额外的数据移动可以节省很多钱。@GordonLinoff对不起,我现在编辑了我的消息,修复了一些错误。是的,我将查询限制为1行(所以我现在也添加了它),但我的问题更一般:当我可以使用python字符串格式向字符串添加“片段”时,为什么我要使用sql“case”编写很长的sql字符串?最终的结果应该是相同的查询和更具可读性的检查数据库可以更快地按进行排序。特别是,此查询的原始版本仅返回1行。不在数据库和应用程序之间进行额外的数据移动可以节省很多钱。@GordonLinoff对不起,我现在编辑了我的消息,修复了一些错误。是的,我将查询限制为1行(所以我现在也添加了它),但我的问题更一般:当我可以使用python字符串格式向字符串添加“片段”时,为什么我要使用sql“case”编写很长的sql字符串?最终结果应该是完全相同的查询和更可读的检查
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)