powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Replacing UNION with CASE
12 сообщений из 12, страница 1 из 1
Replacing UNION with CASE
    #37147483
ananas2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Прочитал здесь http://db2portal.blogspot.com/2009/11/replacing-union-with-case.html о использовании CASE вместо UNION.
Там пример, где в условии when все возможные значения из TYPE. А что делать, если в WHEN не все варианты участвуют например, как в запросе ниже и лишняя выборка из нулей не нужна?
SELECT CREATOR, NAME, 'TABLE'
FROM SYSIBM.SYSTABLES
WHERE TYPE = 'T'
UNION
SELECT CREATOR, NAME, 'VIEW '
FROM SYSIBM.SYSTABLES
WHERE TYPE = 'V'
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37148273
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ananas2,

Добрый день.

Не совсем понял проблему.
Если у вас в CASE обрабатываются все варианты из WHERE, то вы не получите NULL в CASE.
Сравните пример ниже как есть и с убранным комментарием (если у вас, конечно, есть в базе алиасы или mqt):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT *
FROM (
SELECT CREATOR, NAME, TYPE
, CASE TYPE WHEN 'T' THEN 'TABLE' WHEN 'V' THEN 'VIEW' END T
FROM SYSIBM.SYSTABLES
WHERE TYPE IN ('V', 'T'
--, 'S', 'A'
)
) 
WHERE T IS NULL
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37148596
ananas2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Марк,
наверно, все же
SELECT *
FROM (
SELECT CREATOR, NAME, TYPE
, CASE TYPE WHEN 'T' THEN 'TABLE' WHEN 'V' THEN 'VIEW' END T
FROM SYSIBM.SYSTABLES
WHERE TYPE IN ('V', 'T'
--, 'S', 'A'
)
)
WHERE T IS NOT NULL

А SELECT from SELECT with CASE будет лучше по производительности, чем UNION?
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37148968
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ananas2Марк,
наверно, все же
SELECT *
FROM (
SELECT CREATOR, NAME, TYPE
, CASE TYPE WHEN 'T' THEN 'TABLE' WHEN 'V' THEN 'VIEW' END T
FROM SYSIBM.SYSTABLES
WHERE TYPE IN ('V', 'T'
--, 'S', 'A'
)
)
WHERE T IS NOT NULL Нет.
На этом примере я хотел показать, что вы никогда не получите записи с T=NULL, если в CASE обработаны все варианты из WHERE.
ananas2А SELECT from SELECT with CASE будет лучше по производительности, чем UNION?Должен быть лучше.
Ведь с UNION вы получите 2 скана таблицы (или индекса), а с CASE - 1.
Посмотрите план запроса.
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37149580
ananas2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я как раз имел ввиду случай, когда в CASE обрабатываются не все варианты из WHERE.
Когда все - понятно, что лучше будет.
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37149601
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ananas2Я как раз имел ввиду случай, когда в CASE обрабатываются не все варианты из WHERE.Так ещё раз, проблема-то в чём?
В том, что лень в CASE все варианты обработать?
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37149703
ananas2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
quot Mark Barinstein]ananas2Я как раз имел ввиду случай, когда в CASE обрабатываются не все варианты из WHERE.Так ещё раз, проблема-то в чём?
В том, что лень в CASE все варианты обработать?[/quot]

Нет, я не понимаю, можно ли получить такую же выборку как дает запрос ниже через case не используя дополнительно select * from (select case...) where T is not NULL?
create table tab1 (col1 smallint, col2 smallint, type char(1));
insert into tab1 VALUES (1, 1, 'A'), (2,2,'B'), (3,3,'C');

select col1, col2, '1st type' from tab1 where type='A'
union
select col1, col2, '2nd type' from tab1 where type='B';
col1 col2 type1 1 1st type2 2 2nd type
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37149740
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ananas2,

Код: plaintext
1.
2.
3.
4.
select 
  col1, col2
, case type when 'A' then '1st type' when 'B' then '2nd type' end type
from tab1 
where type in ('A', 'B')
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37149750
ananas2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinsteinananas2,

Код: plaintext
1.
2.
3.
4.
select 
  col1, col2
, case type when 'A' then '1st type' when 'B' then '2nd type' end type
from tab1 
where type in ('A', 'B')


Нда...вот это я туплю, так туплю. Спасибо, за терпение :)
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37149760
wpn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ananas2,

Я тоже не понимаю: а почему нельзя перечислить условия в where?
Типа так:
Код: plaintext
1.
2.
3.
4.
SELECT CREATOR, NAME, TYPE
, CASE TYPE WHEN 'T' THEN 'TABLE' WHEN 'V' THEN 'VIEW' END T
FROM SYSIBM.SYSTABLES
WHERE TYPE IN ('V', 'T')
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37149764
wpn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гы, пока я тупил в чем же подвох, все уже разрешилось.
...
Рейтинг: 0 / 0
Replacing UNION with CASE
    #37150435
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осталось загадкой использование "UNION" вместо "UNION ALL". Кроме того, имеет смысл подумать над одновременным выполнением обоих секций UNION ALL. По крайней мере, ораклисты в старые времена говорили, что Oracle может с выгодой параллелить эти секции (но я не исследовал этот вопрос). Разумеется, надо будет исследовать запрос не с SYSIBM.SYSTABLES, где это не имеет смысла, а с чем-то другим.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Replacing UNION with CASE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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