powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / case + ware
19 сообщений из 19, страница 1 из 1
case + ware
    #39842633
petrovichvanya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, в зависимости от типа данных type = 1 или type = 2 нужно выполнять разные условия для отбора данных, подскажите как это можно сделать?
Вот мои наработки
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   where case
           when bs.type = 1 then not exists (select 1
                                               from entities                                                                                                                                        
                                              where topentityid = b.contractid
                                                and linkkind = 80002)
                                                
                   
           else not exists (select 1
                              from entities                                                                                                                                        
                             where topentityid = b.contractid
                               and linkkind = 80005)
        end 
...
Рейтинг: 0 / 0
case + ware
    #39842648
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrovichvanyaЗдравствуйте, в зависимости от типа данных type = 1 или type = 2 нужно выполнять разные условия для отбора данных, подскажите как это можно сделать?
Вот мои наработки
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   where case
           when bs.type = 1 then not exists (select 1
                                               from entities                                                                                                                                        
                                              where topentityid = b.contractid
                                                and linkkind = 80002)
                                                
                   
           else not exists (select 1
                              from entities                                                                                                                                        
                             where topentityid = b.contractid
                               and linkkind = 80005)
        end 


ну or напрмер
или union
Или... в зависимости от.....
...
Рейтинг: 0 / 0
case + ware
    #39842651
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrovichvanya,
или так

Код: plsql
1.
2.
3.
4.
5.
 where 
           not exists (select 1
                                               from entities                                                                                                                                        
                                              where topentityid = b.contractid
                                                and linkkind = case  when bs.type = 1 then 80002 else 80005 end)
...
Рейтинг: 0 / 0
case + ware
    #39842653
petrovichvanya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль, про OR и забыл, спасибо, что напомнили)
...
Рейтинг: 0 / 0
case + ware
    #39842654
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надфиль,

Простота залог успеха.
Делайте функцию и считайте в ней
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function check_it(v_contract_id, v_type) return int deterministic is
res int;
begin
if v_type= 1 then
select count(1) into res from entities where topentityid =v_contract_id and linkkind = 80002;
elsif v_type = 2 then
select count(1) into res from entities where topentityid =v_contract_id and linkkind = 80005;
end if;
return res;
end;



в самом запросе просто
Код: plsql
1.
where check_it(b.contractid,bs.type) = 1
...
Рейтинг: 0 / 0
case + ware
    #39842658
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagorНадфиль,

Простота залог успеха.
Делайте функцию и считайте в ней


эта простота приведет к замедлению работы запроса. существенному.
да и где тут простота то?))
...
Рейтинг: 0 / 0
case + ware
    #39842702
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
   where not exists (select null
                       from entities                                                                                                                                        
                      where topentityid = b.contractid
                        and linkkind = case bs.type when 1 then 80002 else 80005 end
                        )
...
Рейтинг: 0 / 0
case + ware
    #39842707
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно, оптимизатор понимает, что условия с использованием подзапросов следует перестроить так, чтобы подзапросы выполнялись как можно реже?
т.е. например, условие "when not exists(select * from ...) and :x = 1 then" исполнять задом наперед: "when :x = 1 and not exists(select * from ...) then"
наверно понимает.. не пальцем ведь деланый
...
Рейтинг: 0 / 0
case + ware
    #39842721
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
Код: plsql
1.
2.
3.
4.
5.
   where not exists (select null
                       from entities                                                                                                                                        
                      where topentityid = b.contractid
                        and linkkind = case bs.type when 1 then 80002 else 80005 end
                        )


чем Null лучше 1?
...
Рейтинг: 0 / 0
case + ware
    #39842995
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфильчем Null лучше 1?
анекдот - Чем армяне лучше, чем грузины?!
- Чем грузины!


Технически без разницы.
С точки зрения читаемости кода я предпочитаю в данном контексте использовать null
...
Рейтинг: 0 / 0
case + ware
    #39843023
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous[
Технически без разницы.

спасибо.
...
Рейтинг: 0 / 0
case + ware
    #39843073
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousС точки зрения читаемости кода я предпочитаю в данном контексте использовать null

Я пишу там поясняющие комментарии для комплексных запросов, типа:
Код: plsql
1.
not exists (select 'Таблицы без сегментов' from ....)


Иначе какая-нибудь портянка с null, а зачем сделано и какую роль выполняет может быть не очень очевидно.
Читать литерал проще, чем вникать в логику запроса.
Опять же, если есть только sql_id, который, например, нужно оптимизировать, то проще для оптимизации иметь все данные под рукой (v$sqlarea.sql_fulltext), чем выяснять, зачем было написано так, как написано.
...
Рейтинг: 0 / 0
case + ware
    #39843083
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGateandrey_anonymousС точки зрения читаемости кода я предпочитаю в данном контексте использовать null

Я пишу там поясняющие комментарии для комплексных запросов
Поясню немного свои предпочтения:
- комментарии я предпочитаю оформлять комментариями
- литералы в select-list всегда привлекают внимание, они выделяются IDE, за них буквально "цепляется глаз".
В контексте exists это мешает и вызывает некоторое раздражение.
В то же время null - это не-значение, редакторами особо не выделяется и потому конструкцию "exists ( select null from" я безболезненно пропускаю как "стандартное заклинание".
disclaimer: следовать за моими тараканами никого не агитирую, к дискуссии не расположен.
...
Рейтинг: 0 / 0
case + ware
    #39843137
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous- комментарии я предпочитаю оформлять комментариями
Код, который не нуждается в комментариях, предпочтительнее того, который нуждается в них.

andrey_anonymous- литералы в select-list всегда привлекают внимание, они выделяются IDE, за них буквально "цепляется глаз".
В то же время null - это не-значение, редакторами особо не выделяется и потому конструкцию "exists ( select null from" я безболезненно пропускаю как "стандартное заклинание".
Зависит от настроек конкретной IDE.
andrey_anonymousВ контексте exists это мешает и вызывает некоторое раздражение.
Раздражение вызывает множество exists, которые при folding в vim выглядят одинаково (в демонстрации 4 exists, написанные двумя способами, 2 свернуты):

select null - не несет информации полезной для понимания того, что в exists, в отличии от select 'something meaningful'.
Когда на вход имеется запрос из shared pool, комментарии там остутствуют (в случае нединамического SQL из PL/SQL и комментариях не в хинтах).
Соответственно, более эффективно для понимания этих запросов иметь поясняющие литералы, если запрос делает что-то не тривиальное. Иначе придеться обращаться к коду, который еще нужно идентифицировать.
...
Рейтинг: 0 / 0
case + ware
    #39843315
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGateandrey_anonymous- комментарии я предпочитаю оформлять комментариями
Код, который не нуждается в комментариях, предпочтительнее того, который нуждается в них.
Лучше быть богатым и здоровым, чем бедным и больным.
Ну и еще вагон подобных благоглупостей.
От Вашего примера ничем не отличается:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 where not exists ( -- полезный комментарий
                      select  null
                       from entities                                                                                                                                        
                      where topentityid = b.contractid
                        and linkkind = case bs.type when 1 then 80002 else 80005 end
   and not exists ( select --+ полезный комментарий для pl/sql
                             null
                       from entities                                                                                                                                        
                      where topentityid = b.contractid
                        and linkkind = case bs.type when 1 then 80002 else 80005 end
                        )


Собственно null несет вполне понятный смысл: мы НИЧЕГО не выбираем запросом, что вполне соответствует логике exists.
...
Рейтинг: 0 / 0
case + ware
    #39843340
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Код: plsql
1.
where exists ( select  1

?
...
Рейтинг: 0 / 0
case + ware
    #39843367
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K790?
Последний раз.
1 - это ЗНАЧЕНИЕ.
Я сразу пытаюсь понять, нафига оно тут и куда пойдет из подзапроса, повторно втыкаясь в exists - т.е. спотыкаюсь.
null - не-значение и подобного эффекта не производит.

Напоминаю, что никого не агитирую следовать за моими тараканами.
...
Рейтинг: 0 / 0
case + ware
    #39843378
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

теперь мысль понятна, не нервничайте так :)
...
Рейтинг: 0 / 0
case + ware
    #39843382
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousникого не агитирую следовать за моими тараканами.И тем не менее я тоже рекомендую всем самодокументировать код: никакое значение из подзапроса нам не нужно.
Даже несмотря на то, что Oracle переписывает что бы ни было в select-list-е в "select 0".
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / case + ware
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]