只为指定的条件制作CASE

问题描述 投票:0回答:2

我有一个包含 2 列的表格:

Balance
RateCol

我想查询,条件是这样的

X is 2.25
when Balance > 0 then Total = Balance, and RateCol > X
When Balance > 2000000000 then Total = Balance - 2000000000, and RateCol <= X

我首先尝试的是使用

CASE
,但结果不是我想要的

查询:

SELECT 
    Balance, 
    CASE 
        WHEN Balance > 0 AND RateCol > 2.25 THEN Balance
        WHEN Balance > 2000000000 AND RateCol <= 2.25 THEN Balance - 2000000000 
    END AS Total,
    RateCol
FROM
    MyTable

结果:

平衡 总计 RateCol
4428600457.50 2428600457.50 1.400000
15339365000.00 15339365000.00 3.250000
335500000.00 0.750000 < Anomaly
347188820.00 0.750000 < Anomaly

正如您从我的结果中看到的那样,异常也以某种方式包含在内,即使它超出了我定义的范围。

我以为发生这种情况是因为我没有为我没有指定的条件定义

ELSE
,但我只需要我指定的条件的结果,有没有办法实现这个?

我也试过像这样在我的查询中添加 WHERE :

SELECT 
    Balance, 
    CASE 
        WHEN Balance > 0 THEN Balance
        WHEN Balance > 2000000000 THEN Balance - 2000000000 
    END AS Total,
    RateCol
FROM  
    MyTable
WHERE
    RateCol = CASE 
                  WHEN Balance > 0 THEN RateCol > 2.25
                  WHEN Balance > 2000000000 THEN RateCol <= 2.25

但是

CASE
不会比较表达,不知道怎么办

预期结果:

平衡 总计 RateCol
4428600457.50 2428600457.50 1.400000
15339365000.00 15339365000.00 3.250000

不包括异常情况

sql sql-server where-clause case
2个回答
0
投票
WHERE
    RateCol = CASE 
                  WHEN Balance > 0 THEN RateCol > 2.25
                  WHEN Balance > 2000000000 THEN RateCol <= 2.25

这个尝试是不是等同于:

WHERE (Balance > 0          AND RateCol >  2.25)
   OR (Balance > 2000000000 AND RateCol <= 2.25)

0
投票

我认为您认为包含异常是正确的,因为您的 CASE 语句中没有定义 ELSE 子句

在没有ELSE子句的情况下,所有不符合指定条件的情况都返回NULL

我要做的是将您的查询包装在子查询中——过滤掉外部查询中 Total 列中具有 NULL 值的行

SELECT Balance, Total, RateCol
FROM (
  SELECT Balance,
    CASE 
      WHEN Balance > 0 AND RateCol > 2.25 THEN Balance
      WHEN Balance > 2000000000 AND RateCol <= 2.25 THEN Balance - 2000000000 
    END AS Total,
    RateCol
  FROM MyTable
) subquery
WHERE Total IS NOT NULL
  • 子查询使用您提供的相同逻辑计算总计列
  • 外部查询然后过滤掉 Total 列中具有 NULL 值的行,这应该排除您提到的异常。
© www.soinside.com 2019 - 2024. All rights reserved.