使用带有 CASE 和 subselect 的 IN 的 db2 错误

db2 error using IN with CASE and subselect

我在解决此错误时遇到了问题,但是当我 运行 以下查询时,我得到:

SQL0115 Comparison operator IN not valid

据我在文档中得知,这是因为我的 CASE 语句中的 sub-select,但我不确定原因。这是一个我试图从 MySQL 转移到 DB2 的查询,所以我知道会出现一些问题,但我不明白为什么这会成为一个特别的问题。

基本上,在这种情况下,扩展名将是会话 table 中的 finallycalledpartynocallingpartyno,但我想 select 基于其中一个我用户的 table.

中有哪一个

因此,如果用户的分机号为 1234,那么在会话 table 中,每条记录将具有 finallycalledpartynocallingpartyno 作为 1234,这就是我想要用作 extension。有什么特别的方法可以解决这个问题吗?

SELECT distinct
  case
  when callingpartyno       in  (select extension from hn.users where active = 1)
  then callingpartyno
  when finallycalledpartyno in  (select extension from hn.users where active = 1)
  then finallycalledpartyno
  end as extension
FROM
    hn.session a
    join hn.call_summary b
    on a.notablecallid = b.notablecallid
    where
    date(a.ts) >= curdate()
    and (
    callingpartyno in  (select extension from hn.users where active = 1)
    or  finallycalledpartyno in  (select extension from hn.users where active = 1)
    )
    group by extension

示例数据

finallycalledpartyno  |  callingpartyno  |  seconds
---------------------------------------------------
1234                        123456          20
1234                        123456          20
1234                        123456          20
123456                      1234            10
123456                      1234            10
123456                      1234            10
4321                        123456          20
4321                        123456          20
4321                        123456          20
123456                      4321            20
123456                      4321            20
123456                      4321            20

所以现在我可以得到 2 行

Extension | secondsWhereFC  |  secondsWhereCP
---------------------------------------------
1234            60                  30
4321            60                  60

对你有用吗?

with query_res (finallycalledpartyno, callingpartyno, seconds) as (values 
  (1234 , 123456, 20) 
, (123456 , 4321 , 10) 
) 
, users (extension, active) as (values 
  (1234, 1) 
, (4321, 1) 
) 
select q.*, coalesce(c.extension, f.extension) 
from query_res q 
left join (select distinct extension from users where active=1) c on c.extension=q.callingpartyno 
left join (select distinct extension from users where active=1) f on f.extension=q.finallycalledpartyno;