在 case 语句中使用 Max(boolean)

Using Max(boolean) in a case statement

提问人:RiotF 提问时间:2/15/2021 最后编辑:RiotF 更新时间:2/16/2021 访问量:1033

问:

我在数据库中制作了一个临时帐户表,其中包含提供有关帐户的见解的布尔值。有些客户有多个帐户,所以我将它们分组在一起,并尝试查看 MAX(布尔值)来设置状态字段。

我的查询有点像:

with t as (Select lngCustomerNumber, 
           Case
             When 'Criteria for being Active' Then 1
           End as blnActive, 
            Case 
            When 'Criteria for unexpired' Then 1
           End as blnUnexpired
From AccountTable) 
Select t.CustomerNumber, 
        Case 
           When Max(t.blnActive) = 1 
           AND  Max(t.blnUnexpired) = 1 Then 'Active/Unexpired' 
           When Max(t.blnActive) = 1 
           AND  Max(t.blnUnexpired) = 0 Then 'Active/Expired' 
           When Max(t.blnActive) = 0 
           AND  Max(t.blnUnexpired) = 1 Then 'Inactive/Unexpired' 
           When Max(t.blnActive) = 0 
           AND  Max(t.blnUnexpired) = 0 Then 'Inactive/Expired'
    End As strLicenseStatus
From T
Group By t.CustomerNumber

它检查 Max(Boolean) = 1 是否正确计算为 True 的任何内容,但是如果我执行 Max(Boolean) = 0 或 Max(Boolean) <> 1,那么它不会在应该计算为 True 时。 我通过查看分组的 Temp Table 进行了测试,每个布尔值都返回其 Max() 值,而应该为 0 的值返回为 0。

作为解决方法,我尝试过

Where t.CustomerNumber  NOT IN  (SELECT t2.CustomerNumber

            FROM    t t2 

            WHERE   t2.blnUnexpired    = 1 
            AND t2.CustomerNumber    = t.CustomerNumber  ) 

这确实给了我正在寻找的结果,但我有数百万行返回,所以它在几个小时后超时了,而以前的方法能够在不到一个小时的时间内运行。

我的查询中还有其他一些数据,显示的数据是一个更小的版本,用于突出显示我的问题。

关于我如何做到这一点的任何建议? 谢谢。

SQL Oracle 聚合 布尔逻辑

评论

1赞 Gordon Linoff 2/15/2021
使用您正在使用的数据库标记您的问题。
0赞 jarlh 2/15/2021
根据 ANSI SQL,布尔值为 TRUE、FALSE,也可能是 UNKNOWN/null。对>错。
0赞 RiotF 2/16/2021
抱歉,我正在使用 Oracle。我已经编辑并添加了标签。
1赞 Koen Lostrie 2/16/2021
与其说“我的查询有点像......”,不如想出一个真实的、可重复的例子来模仿你遇到的问题?这样可以更轻松地帮助您解决问题。
0赞 William Robertson 2/16/2021
我在您的查询中没有看到任何布尔值。Oracle SQL 没有布尔值。我不明白你在问什么。

答:

0赞 eaolson 2/16/2021 #1

定义 and 案例时,只定义了“1”个案例,这意味着如果它不满足这些条件,它将为 null。尝试添加到每个案例中:blnActiveblnUnexpiredelse 0

with t as (Select lngCustomerNumber, 
           Case
             When 'Criteria for being Active' Then 1
             Else 0
           End as blnActive, 
            Case 
              When 'Criteria for unexpired' Then 1
              Else 0
           End as blnUnexpired
From AccountTable)