2014-12-05 4 views
1

Взгляните на начало этого запроса:результаты повторного использования с SQL функций

SELECT 
    sum(decode(REGEXP_COUNT(tpdd.domain, 'thedomain.com'), 1, tpdd.size, 0, 0)) SizeClient, 
    sum(decode(REGEXP_COUNT(tpdd.domain, 'thedomain.com'), 1, 0, 0, tpdd.size)) SizeThirdParty, 
    ... 

Есть ли способ, чтобы повторно использовать результаты «REGEXP_COUNT (tpdd.domain,„thedomain.com“)» функция ? Я должен надеяться, что сервер oracle достаточно умен, чтобы сделать это, но я не могу этого гарантировать, и, кроме того, код будет выглядеть лучше без повторного кода.

+1

Вы могли бы, по-видимому, переместить вычисление в 'tpdd' подзапроса (или преобразовать' tpdd' запрос в вложенное представление и добавить, что). Однако я бы не ожидал, что какая-то неопределенная недавняя версия Oracle повторит вызов функции. –

ответ

4

Вы можете использовать CTE, как это:

WITH domain_regex as 
(
    SELECT tpdd.domain, REGEXP_COUNT(tpdd.domain,'thedomain.com') as regex_res 
    FROM ... 
) 
SELECT 
    sum(decode(d.regex_res, 1, tpdd.size, 0, 0)) SizeClient, 
    sum(decode(d.regex_res, 1, 0, 0, tpdd.size)) SizeThirdParty, 
    ... 
JOIN domain_regex d on tpdd.domain = d.domain 
Смежные вопросы