Django中的初学者SQL IF子句

时间:2016-05-10 14:40:51

标签: sql django postgresql

我需要能够处理Django中的Division By Zero错误。以下SQL导致它:

select *, (available_credit * 100 / credit_limit)::integer as percent_available from
(SELECT
  a.id,

在第一行,人们的credit limit有时会为0,我希望能够处理这种情况,以便生成的percent_available变量可以为0.

我试图用我鲜为人知的SQL找到修复程序,但它显然不起作用:

IF (credit_limit = 0)
  0::integer as percent_available from
ELSE
  (available_credit * 100 / credit_limit)::integer as percent_available from
(SELECT
  a.id,

有可行的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您正在编写原始sql并且输出相当容易但是django需要一些工作,那么可以使用CASE,WHEN。

SELECT A.*, CASE WHEN credit_limit = 0 THEN 10000
ELSE
  (available_credit * 100 / credit_limit)::integer 
END as percent_available from
(SELECT
  a.id, ....) AS A

当credit_limit为零时,将可用百分比报告为零将完全不正确。您应该以N / A或其他方式向用户报告。

回到django,你会使用CASE表达式。

  

Case()表达式与if中的if ... elif ... else语句类似   蟒蛇。计算所提供的When()对象中的每个条件   命令,直到一个人评估一个真实的价值。结果表达式   从匹配的When()对象返回。

现在假设您的模型名为Credit,则查询可能是。

Credit.objects.all().annotate(credit_available = 
   Case(
     When(credit_limit = 0, Then value 10000)
     default = F('available_credit')*100/F('credit_limit'))
 )

答案 1 :(得分:0)

使用CASE

SELECT *, CASE WHEN (credit_limit = 0) THEN /* code */ ELSE /* code */ END AS
percent_available FROM ...