以下2个代码有什么不同,我的输出差异很大。
1)
SUM(
CASE
WHEN lientype.id NOT IN (-1, -3) THEN
((a.floatingspread + dbo.maxfloat(a.floatingspreadfloor, al.liborrate)) * pos.marketvalue)
ELSE 0
END)/NULLIF(sum(
CASE
WHEN lientype.id NOT IN (-1,
-3) THEN
(pos.marketvalue)
ELSE 0
END),0) averagecoupon
2)
SUM(
CASE
WHEN (
lientype.id<>-1
OR
lientype.id<>-3
)
THEN
((a.floatingspread + dbo.maxfloat(a.floatingspreadfloor, al.liborrate)) * pos.marketvalue)
ELSE 0
END)/NULLIF(sum(
CASE
WHEN (
lientype.id<>-1
OR
lientype.id<>-3
)
THEN
(pos.marketvalue)
ELSE 0
END),0) averagecoupon
答案 0 :(得分:2)
您案件的NOT IN
应转换为<> -1 AND <> -3
。 <> -1 OR <> -3
大致转换为NOT IN (-1) OR NOT IN (-3)
,因此输出会有很大不同。
答案 1 :(得分:1)
此:
lientype.id<>-1
OR
lientype.id<>-3
应该是:
lientype.id<>-1
AND
lientype.id<>-3
以便等同于:
lientype.id NOT IN (-1, -3)
你现在正在做的只是说lientype.id is not -1 or it is not -3
,但显然它不能同时等于这两个值,所以它总是true
。
答案 2 :(得分:0)
当A和B本身不相等时,所有值都是
不等于A
或
不等于B
就像在说,“给我一切不是-1
的东西,以及那些不是-3
的东西。”这跟一切都一样。
这是一项无意义的检查,可以省略。
其中,NOT IN (A, B)
相当于除A或B之外的所有东西。
在你的片段中,你可以次优地写,
WHEN NOT (lientype.id = -1 OR lientype.id = -3)
作为
的直接逻辑替代品WHEN lientype.id NOT IN (-1, -3)
答案 3 :(得分:0)
表达式:
lientype.id NOT IN (-1, -3)
相当于:
NOT (lientype.id = -1 OR lientype.id = -3)
也相当于:
lientype.id != -1 AND lientype.id != -3
或
lientype.id <> -1 AND lientype.id <> -3
当您将NOT
分配到括号中的内容时,您需要将所有布尔逻辑和比较运算符“翻转”在一起(AND -> OR
,OR -> AND
,{{1 }和= -> !=
)。您已颠倒了相等运算符(!= -> =
),但没有反转布尔值= -> <>
。
答案 4 :(得分:0)
晚会但您仍然可以使用OR
,但需要使用=并切换THEN
和END
SELECT
SUM( CASE
WHEN (
lientype.id=-1
OR
lientype.id=-3
)
THEN 0
ELSE ((a.floatingspread + dbo.maxfloat(a.floatingspreadfloor, al.liborrate)) * pos.marketvalue)
END)
/NULLIF(SUM(
CASE
WHEN (
lientype.id=-1
OR
lientype.id=-3
)
THEN 0
ELSE
(pos.marketvalue)
END),0) averagecoupon -- DIVIDE BY ZERO?