使用带有 CASE 和 subselect 的 IN 的 db2 错误
db2 error using IN with CASE and subselect
我在解决此错误时遇到了问题,但是当我 运行 以下查询时,我得到:
SQL0115 Comparison operator IN not valid
据我在文档中得知,这是因为我的 CASE 语句中的 sub-select,但我不确定原因。这是一个我试图从 MySQL 转移到 DB2 的查询,所以我知道会出现一些问题,但我不明白为什么这会成为一个特别的问题。
基本上,在这种情况下,扩展名将是会话 table 中的 finallycalledpartyno
或 callingpartyno
,但我想 select 基于其中一个我用户的 table.
中有哪一个
因此,如果用户的分机号为 1234,那么在会话 table 中,每条记录将具有 finallycalledpartyno
或 callingpartyno
作为 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;
我在解决此错误时遇到了问题,但是当我 运行 以下查询时,我得到:
SQL0115 Comparison operator IN not valid
据我在文档中得知,这是因为我的 CASE 语句中的 sub-select,但我不确定原因。这是一个我试图从 MySQL 转移到 DB2 的查询,所以我知道会出现一些问题,但我不明白为什么这会成为一个特别的问题。
基本上,在这种情况下,扩展名将是会话 table 中的 finallycalledpartyno
或 callingpartyno
,但我想 select 基于其中一个我用户的 table.
因此,如果用户的分机号为 1234,那么在会话 table 中,每条记录将具有 finallycalledpartyno
或 callingpartyno
作为 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;