Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6317
Последний выпуск: 19.06.2015

Оптимизация запроса

15K
18 февраля 2012 года
Ybr
31 / / 19.03.2007
Доброго времени суток, господа!

По работе начал изучать PL/SQL. И в процессе написания одного запроса у меня появилась мысль, что туже функциональность обязательно можно реализовать проще, короче и красивее. Мой "некрасивый" запрос работает (sic!), но совершенно не нравятся его размеры. Интересно ваше мнение на тему: как можно сделать его короче.
Объяснять, что делает запрос, не вижу смысла:
Код:
SELECT *
  FROM account
 WHERE code LIKE '40401%'
    OR code LIKE '40402%'
    OR code LIKE '40403%'
    OR code LIKE '40404%'
    OR code LIKE '40405%'
    OR code LIKE '40406%'
    OR code LIKE '40409%'
    OR code LIKE '40410%'
    OR code LIKE '40501%'
    OR code LIKE '40502%'
    OR code LIKE '40503%'
    OR code LIKE '40504%'
    OR code LIKE '40505%'
    OR code LIKE '40601%'
    OR code LIKE '40602%'
    OR code LIKE '40603%'
    OR code LIKE '40701%'
    OR code LIKE '40702%'
    OR code LIKE '40703%'
    OR code LIKE '40704%'
    OR code LIKE '40802%'
    OR code LIKE '40817%'
    OR code LIKE '423%'
    OR code LIKE '421%'
   AND ishidden <> ' '
   AND sysfilial = 46
   AND label LIKE 'Комис%'
   AND currency <> 1000001275


В процессе оптимизации пытался сделать вот так:
 
Код:
SELECT *
  FROM account
 WHERE code IN ('40401%', '40402%', '40403%', '40404%', '40405%', '40406%',
        '40409%', '40410%', '40501%', '40502%', '40503%', '40504%',
        '40505%', '40601%', '40602%', '40603%', '40701%', '40702%',
        '40703%', '40704%', '40802%', '40817%', '423%', '421%')
   AND ishidden <> ' '
   AND sysfilial = 46
   AND label LIKE 'Комис%'
   AND currency <> 1000001275


Но после первого же прогона понял, что оператор [font=courier]IN[/font] не умеет работать с шаблонами (т.е. результирующего набора от второго скрипта не было, а от первого - был).

Каково ваше мнение: можно ли упростить запрос?
56K
18 февраля 2012 года
Rnoman
3 / / 01.02.2010
Можно попробовать функцию SUBSTR
 
Код:
SELECT * FROM account
WHERE (SUBSTR(code, 1, 3) BETWEEN 404 AND 408  
       AND    
       SUBSTR(code, 4, 5) < '06' OR  SUBSTR(code, 4, 5) IN ('09', '10', '17'))
   OR  SUBSTR(code, 1, 3) IN ('421', '423')
   AND ishidden <> ' '
   AND sysfilial = 46
   AND label LIKE 'Комис%'
   AND currency <> 1000001275

А можно попробовать регулярные выражения
http://www.oracloid.ru/index.php?t=169
 
Код:
SELECT * FROM account
WHERE regexp_like(code,'4((0[45678][01][^8])|(2[13]))')
  AND ishidden <> ' '
  AND sysfilial = 46
  AND label LIKE 'Комис%'
  AND currency <> 1000001275
15K
18 февраля 2012 года
Ybr
31 / / 19.03.2007
Я немного удивился, что в PL/SQL есть регулярные выражения. Этот язык оставил у меня впечатление весьма консервативного.
Хотя понятно, что это все надстройки. Но тем не менее...

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог