【问题标题】:SQL Where clause does not filter out "Zero" valuesSQL Where 子句不过滤掉“零”值
【发布时间】:2014-09-19 01:23:40
【问题描述】:

我有两张表,分别称为“恢复”和“分期付款”。

Recovery ([pk] RID, emp_id, amount, duration, type]

Installments ([pk] ID, [fk] recovery_id, recovered_amount, date)

当员工获得贷款时,该信息存储在Recovery 表中。然后从月薪中分期偿还这笔贷款。 (分期付款是[amount /duration])。 恢复后,有关已恢复分期付款的详细信息应存储在Installments 表中。由于贷款可能分期收回,Recovery 与 Payments 的关系为1:M.

现在假设我只想找出应该从工资中扣除的所有恢复细节。我在这方面写了这个查询。这里我取所有已付分期付款的总和,然后从贷款金额中扣除,如果余额大于 0,则计算分期付款。预期结果是Emp_DI | Installment

WITH Summary (RID, emp_id, amount, duration, installment) 

AS(

SELECT Recovery.RID, Recovery.emp_id, Recovery.amount, Recovery.duration,   SUM(Installment.recovered_installment) AS Installments
FROM Recovery LEFT OUTER JOIN
Installment ON Recovery.RID = Installment.recovery_id

WHERE Recovery.type = 'Loan'                       
GROUP BY Recovery.duration, Recovery.amount, Recovery.emp_id, Recovery.RID 
)  

SELECT emp_id, SUM(amount / duration) AS INS FROM Summary  
WHERE ((CASE WHEN installment != NULL THEN (amount-installment) 
                      ELSE(amount) END)> 0 )
GROUP BY emp_id 

此查询运行良好,可提供所需的输出,但有一个例外。 IE。似乎 WHERE 子句中存在问题。

 WHERE ((CASE WHEN installment != NULL THEN (amount-installment) 
                          ELSE(amount) END)> 0 )

这不会按预期过滤掉余额为零的记录。我无法理解这其中的原因。那么你能帮帮我吗?非常感谢您的帮助!

【问题讨论】:

  • 谢谢所有回答的人。我没有意识到这一点;)我刚刚接受了第一个答案。再次感谢它真的很有帮助!

标签: sql sql-server filtering where-clause common-table-expression


【解决方案1】:

你需要is not null:

 WHERE ((CASE WHEN installment IS NOT NULL THEN (amount-installment) 
               ELSE(amount) END)> 0 )

几乎所有与NULL 的比较,包括= NULL<> NULL 返回NULL。并且,NULL 被视为错误。使用IS NULLIS NOT NULL

【讨论】:

    【解决方案2】:

    条件installment != NULL 需要替换为installment is not null

    All comparisons to NULL return FALSE.

    对于您正在进行的具体比较,这个 WHERE 子句可能更容易理解:

    WHERE (amount - COALESCE(installment,0)) > 0
    

    【讨论】:

      【解决方案3】:
       WHERE ( installment IS NOT NULL AND (amount-installment) > 0)
           OR ( installment IS NULL AND AMOUNT >0)
      

      在 Sql Server 中,NULL 是一个 Unknown 值,因此您不可能将未知值与任何其他值进行比较。因此在 sql server 中检查空值时使用IS NULLIS NOT NULL

      【讨论】:

        【解决方案4】:

        我想你是想把它放在有子句中吗?这行得通吗?

        WITH Summary as
         (SELECT Recovery.RID,
                 Recovery.emp_id,
                 Recovery.amount,
                 Recovery.duration,
                 SUM(Installment.recovered_installment) AS Installments
            FROM Recovery
            LEFT OUTER JOIN Installment
              ON Recovery.RID = Installment.recovery_id
           WHERE Recovery.type = 'Loan'
           GROUP BY Recovery.duration,
                    Recovery.amount,
                    Recovery.emp_id,
                    Recovery.RID)
        SELECT emp_id, SUM(amount / duration) AS INS
          FROM Summary
         GROUP BY emp_id
        having sum (CASE WHEN installments is not NULL
                         THEN(amount - installments) ELSE(amount) END) > 0
        

        正如其他人所指出的,“不为空”也是不等于空的正确说法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-21
          • 2016-07-02
          • 2023-03-27
          • 2015-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多