Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
Добрый день! Прочитал здесь 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' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2011, 17:54 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
ananas2, Добрый день. Не совсем понял проблему. Если у вас в CASE обрабатываются все варианты из WHERE, то вы не получите NULL в CASE. Сравните пример ниже как есть и с убранным комментарием (если у вас, конечно, есть в базе алиасы или mqt): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 09:59 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
Марк, наверно, все же 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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 11:52 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
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. Посмотрите план запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 13:45 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
Я как раз имел ввиду случай, когда в CASE обрабатываются не все варианты из WHERE. Когда все - понятно, что лучше будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 17:09 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
ananas2Я как раз имел ввиду случай, когда в CASE обрабатываются не все варианты из WHERE.Так ещё раз, проблема-то в чём? В том, что лень в CASE все варианты обработать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 17:17 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 18:09 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
ananas2, Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 18:48 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
Mark Barinsteinananas2, Код: plaintext 1. 2. 3. 4. Нда...вот это я туплю, так туплю. Спасибо, за терпение :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 18:53 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
ananas2, Я тоже не понимаю: а почему нельзя перечислить условия в where? Типа так: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 18:57 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
гы, пока я тупил в чем же подвох, все уже разрешилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2011, 18:59 |
|
||
|
Replacing UNION with CASE
|
|||
|---|---|---|---|
|
#18+
Осталось загадкой использование "UNION" вместо "UNION ALL". Кроме того, имеет смысл подумать над одновременным выполнением обоих секций UNION ALL. По крайней мере, ораклисты в старые времена говорили, что Oracle может с выгодой параллелить эти секции (но я не исследовал этот вопрос). Разумеется, надо будет исследовать запрос не с SYSIBM.SYSTABLES, где это не имеет смысла, а с чем-то другим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2011, 10:08 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=37149750&tid=1602354]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 16ms |
| total: | 199ms |

| 0 / 0 |
