Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обработать null в условии where 
V
    Опции темы
aleksh
Дата 31.7.2012, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



Добрый день

помогите отредактировать запрос, есть
Код

select *
from table
where table.name = :param


раньше параметр гарантировано передавался, теперь может передаваться null
как исправить запрос, что бы в случае null выбирались все данные?
PM MAIL   Вверх
aleksh
Дата 31.7.2012, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: нет
Всего: 13



позор моим сединам, надо было
Код

where (table.name = :param or :param is null)

вопрос закрыт

Это сообщение отредактировал(а) aleksh - 31.7.2012, 15:10
PM MAIL   Вверх
Zloxa
Дата 31.7.2012, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



table.name индексировано?
если нет, нормуль, сойдет.
если да, прощай индексный доступ, но можно пойти чуть другим путем:
Код

select * from table where table.name = :param
union all
select * from table where :param is null

возможность использования индекса при определенном значении параметра - сохраняется
приведу пример
1) DDL
Цитата

SQL> create table test(val ) as select level from dual connect by level < 10000;

Table created.

SQL> create index test$val$idx on test(val);

Index created.
SQL> variable param number;
SQL> execute :param := 1

PL/SQL procedure successfully completed.
SQL> set autotrace traceonly explain statistics


2) Оба варианта запроса выполняю вхолостую, чтоб поттянулись кэши, произошел парсинг, не влияло на статистику

3)Ваш вариант запроса
Цитата

SQL> select * from test where val = :param or :param is null;


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=595 Bytes=7
          735)

   1    0   TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=7 Card=595 Byt
          es=7735)





Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         20  consistent gets
          0  physical reads
          0  redo size
        345  bytes sent via SQL*Net to client
        431  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

Мы видим в плане фуллскан и видим 20 согласованных чтений
4) мой вариант запроса
Цитата

SQL> select * from test where val = :param union all select * from test where :param is null;


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=10099 Bytes
          =131287)

   1    0   UNION-ALL
   2    1     INDEX (RANGE SCAN) OF 'TEST$VAL$IDX' (INDEX) (Cost=1 Car
          d=100 Bytes=1300)

   3    1     FILTER
   4    3       TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=7 Card=999
          9 Bytes=129987)





Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        345  bytes sent via SQL*Net to client
        431  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


Здесь мы тоже видим фуллскан в плане, но количество чтений всего три, что дает основания полагать, что хоть фуллскан и есть в плане, на практике эта ветка плана не выполняется.

Это сообщение отредактировал(а) Zloxa - 31.7.2012, 17:07


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0987 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.