2017-07-31 80 views
0

查詢,如:爲什麼使用CASE WHEN而不是編程語言控制語句?

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

執行'order by'命令可以快得多。特別是,此查詢的原始版本只返回1行。沒有在數據庫和應用程序之間進行額外的數據移動有很大的節約。 –

+0

@GordonLinoff對不起,我現在編輯我的消息修復一些錯誤。是的,我限制了我的查詢1行(所以我現在也添加了它),但我的問題是更一般的:爲什麼我應該使用sql「case」編寫一個非常長的sql字符串時,我可以使用python字符串格式添加「件」字符串?最終結果應該是相同的查詢並且更具可讀性 – 91DarioDev

+0

檢查https://dba.stackexchange.com/questions/160237/does-it-make-sense-to-have-case-end-in-an-order-通過 – joanolo

回答

1

動態構建查詢是一個合理的策略,只要您仔細注意SQL注入。但是讓數據庫引擎完成這項工作通常更容易。根據具體情況,數據庫引擎可以緩存查詢併爲您做其他有用的事情。

您唯一需要使用動態查詢的方式是變量部分是數據庫引擎不會將其視爲變量(如架構和對象名稱)或存在/不存在整個子句(ORDER BY,LIMIT和等等)。其餘時間,這是個人品味/判斷力。