Оптимизация запроса
По работе начал изучать 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
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
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] не умеет работать с шаблонами (т.е. результирующего набора от второго скрипта не было, а от первого - был).
Каково ваше мнение: можно ли упростить запрос?
Код:
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
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
WHERE regexp_like(code,'4((0[45678][01][^8])|(2[13]))')
AND ishidden <> ' '
AND sysfilial = 46
AND label LIKE 'Комис%'
AND currency <> 1000001275
Хотя понятно, что это все надстройки. Но тем не менее...