CftClub.ru
Клуб специалистов ЦФТ-Банк

CASE WHEN THEN ошибка
На страницу Пред.  1, 2
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеВс Июл 22, 2018 20:26    Ответить с цитатой
Полезность: Нет оценки
здоров!

Client_v , не _r

попробуй через оr
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеПн Июл 23, 2018 17:44    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
здоров!

Client_v , не _r

попробуй через оr



Итого пара вариантов

--------------------------------------------------------
1. Без CASE и UNION... Стоимость Plan hash value: 1322325846


select z(sum(z.c)) in
(


select x(count(x) :c ) in ::[AC_FIN] all
where
(
(
class_ = 'CL_ORG'
and
x.[CLIENT_V] in (p_client)
)
or
(
class_ = 'CL_PRIV'
and
x.[CLIENT_V] in
( select w(w.[PARTNER])
in ::[LINKS_CL]
,(::[CL_ORG] all: org) all
where w%collection = p_client.[LINKS_OTHER]
and w.[PARTNER] = org
)
)
)
and
(
(
x.[COM_STATUS] != ::[COM_STATUS_PRD]([CODE]='TO_OPEN')
)
or
(
x.[COM_STATUS] is null
)
)


--------------------------------------------------------
2. Без CASE и с 1им UNION... Стоимость Plan hash value: 3895021466

----------------------------------------

select x(count(x) :c ) in ::[AC_FIN] all
where x.[CLIENT_V] in (p_client)
and class_ in ('CL_ORG')
and
(
(
x.[COM_STATUS] != ::[COM_STATUS_PRD]([CODE]='TO_OPEN')
)
or
(
x.[COM_STATUS] is null
)
)
union all
----------------------------------------
select x(count(x) :c ) in ::[AC_FIN] all
where x.[CLIENT_V] in
(select w(w.[PARTNER])
in ::[LINKS_CL]
,(::[CL_ORG] all: org) all
where w%collection = p_client.[LINKS_OTHER]
and w.[PARTNER] = org
)
and class_ in ('CL_PRIV')
and
(
(
x.[COM_STATUS] != ::[COM_STATUS_PRD]([CODE]='TO_OPEN')
)
or
(
x.[COM_STATUS] is null
)
)


Судя по стоимости 1 вариант наиболее кошерный
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Июл 24, 2018 09:14    Ответить с цитатой
Полезность: 1
Зачем городить Union? Через
Код:
If class_ = 'CL_PRIV' then
не проще?
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Июл 24, 2018 09:24    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
Зачем городить Union? Через
Код:
If class_ = 'CL_PRIV' then
не проще?


Если через if на два запроса придется разбивать)
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Июл 24, 2018 09:30    Ответить с цитатой
Полезность: Нет оценки
И что? Это же count into.
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеВт Июл 24, 2018 10:26    Ответить с цитатой
Полезность: 1
что-то смотрю на код и не понимаю.
Если class_ - это переменная, то зачем организовыать ветвление в запросе, проще организовать через обычный if then elsif.

Код:

if class_ = 'CL_ORG' then
   select x(count(1)) in ::[AC_FIN] all
   where   x.client_v = p_client
   and   x.[COM_STATUS] != ::[COM_STATUS_PRD]([ CODE]='TO_OPEN')
   into nCnt;

elsif class_ = 'CL_PRIV' then
   select x(count(1)) in ::[AC_FIN] all
   where   x.client_v in (

select w(org)
in ::[LINKS_CL]
,(::[CL_ORG] all: org) all
where w%collection = p_client.[LINKS_OTHER]
and   w.[PARTNER] = org

)
   and   x.[COM_STATUS] != ::[COM_STATUS_PRD]([ code]='TO_OPEN')
   into nCnt;

else
   nCnt := 0;
end if;


а если уж так необходимо сделать всё именно через SQL, то так:
Код:

select z(case when class_ = 'CL_ORG' then
(
   select x(count(1)) in ::[AC_FIN] all
   where   x.client_v = p_client
   and   x.[COM_STATUS] != ::[COM_STATUS_PRD]([ CODE]='TO_OPEN')
)

when class_ = 'CL_PRIV' then
(
   select x(count(1)) in ::[AC_FIN] all
   where   x.client_v in (

select w(org)
in ::[LINKS_CL]
,(::[CL_ORG] all: org) all
where w%collection = p_client.[LINKS_OTHER]
and   w.[PARTNER] = org

)
   and   x.[COM_STATUS] != ::[COM_STATUS_PRD]([ code]='TO_OPEN')
)

else
   0
end

) in dual%rowtype
into nCnt;
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Июл 24, 2018 10:43    Ответить с цитатой
Полезность: Нет оценки
Эмиралька пишет:
что-то смотрю на код и не понимаю.
Если class_ - это переменная, то зачем организовыать ветвление в запросе, проще организовать через обычный if then elsif.

Код:

if class_ = 'CL_ORG' then
   select x(count(1)) in ::[AC_FIN] all
   where   x.client_v = p_client
   and   x.[COM_STATUS] != ::[COM_STATUS_PRD]([ CODE]='TO_OPEN')
   into nCnt;

elsif class_ = 'CL_PRIV' then
   select x(count(1)) in ::[AC_FIN] all
   where   x.client_v in (

select w(org)
in ::[LINKS_CL]
,(::[CL_ORG] all: org) all
where w%collection = p_client.[LINKS_OTHER]
and   w.[PARTNER] = org

)
   and   x.[COM_STATUS] != ::[COM_STATUS_PRD]([ code]='TO_OPEN')
   into nCnt;

else
   nCnt := 0;
end if;


а если уж так необходимо сделать всё именно через SQL, то так:
Код:

select z(case when class_ = 'CL_ORG' then
(
   select x(count(1)) in ::[AC_FIN] all
   where   x.client_v = p_client
   and   x.[COM_STATUS] != ::[COM_STATUS_PRD]([ CODE]='TO_OPEN')
)

when class_ = 'CL_PRIV' then
(
   select x(count(1)) in ::[AC_FIN] all
   where   x.client_v in (

select w(org)
in ::[LINKS_CL]
,(::[CL_ORG] all: org) all
where w%collection = p_client.[LINKS_OTHER]
and   w.[PARTNER] = org

)
   and   x.[COM_STATUS] != ::[COM_STATUS_PRD]([ code]='TO_OPEN')
)

else
   0
end

) in dual%rowtype
into nCnt;


Приветствую Эмиралька...
У меня вариант
[code]
if class_ = 'CL_ORG' then

select x(count(x) : c) in ::[AC_FIN] all
where
x.[CLIENT_V] = p_client
and
(
(
x.[COM_STATUS] != ::[COM_STATUS_PRD]([CODE]='TO_OPEN')
)
or
(
x.[COM_STATUS] is null
)
)
into cnt;

elsif class_ = 'CL_PRIV' then

select x(count(x) : c) in ::[AC_FIN] all
where x.[CLIENT_V] in
( select w(w.[PARTNER])
in ::[LINKS_CL]
,(::[CL_ORG] all: org) all
where w%collection = p_client.[LINKS_OTHER]
and w.[PARTNER] = org
)
and
(
(
x.[COM_STATUS] != ::[COM_STATUS_PRD]([code]='TO_OPEN')
)
or
(
x.[COM_STATUS] is null
)
)
into cnt;




else
pragma error('Клиент ID = '||p_client||' имеет класс '||class_||' для которого не определен алгоритм разрешения синхронизации !');
end if;

end if;
[/code]

Между вариантами разница лишь в

or
(
x.[COM_STATUS] is null
)

и

x(count(x)
x(count(1))

Если прибегут пользователи с вилами и вопросами, то мне проще им сказать что предыдущие разработчики ) предусмотрели именно такие условия проверок aka x.[COM_STATUS] is null )))

Протестировал, запросов 20 прогнал (составная часть интеграции) ... замечаний нет... видимо карйний вариант пойдет в прод
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеСр Июл 25, 2018 07:33    Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:
Эмиралька пишет:
что-то смотрю на код и не понимаю.
Если class_ - это переменная, то зачем организовыать ветвление в запросе, проще организовать через обычный if then elsif.
[skip]


Приветствую Эмиралька...
У меня вариант
Код:

      if class_ = 'CL_ORG' then
[skip]
      elsif class_ = 'CL_PRIV' then
[skip]
      else   
[skip]
      end if;

[skip]

Протестировал, запросов 20 прогнал (составная часть интеграции) ... замечаний нет... видимо карйний вариант пойдет в прод

Ой, простите, Volod выше упоминал про ifы Embarassed
Ну что ж, значит, это и правда хороший вариант Smile
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу Пред.  1, 2
Страница 2 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru