Ошибка db2 при использовании IN с CASE и последующим выбором - PullRequest
0 голосов
/ 05 ноября 2018

У меня проблема с устранением этой ошибки, но когда я запускаю приведенный ниже запрос, я получаю:

SQL0115 Comparison operator IN not valid

Из того, что я могу сказать в документации, это происходит из-за подвыбора в моем операторе CASE, но я не уверен почему. Это запрос, который я пытаюсь переместить с MySQL на DB2, поэтому я знаю, что будут некоторые проблемы, но я не понимаю, почему это может быть проблемой.

По сути, расширение в этом случае будет либо finallycalledpartyno, либо callingpartyno в таблице сеансов, но я хочу выбрать одно из них на основе того, какое из них находится в таблице моего пользователя.

Так что, если у пользователя есть расширение 1234, то в таблице сеансов каждая запись будет иметь 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

1 Ответ

0 голосов
/ 06 ноября 2018

У вас работает?

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;
...