我有一个包含 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 |
(不包括异常情况)
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)
我认为您认为包含异常是正确的,因为您的 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