重用sql函数的结果

重用sql函数的结果,sql,oracle,Sql,Oracle,请看一下此查询的开头: 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_COUNTtpdd.domain“thed

请看一下此查询的开头:

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_COUNTtpdd.domain“thedomain.com”函数的结果?我希望oracle server足够智能,可以做到这一点,但我不能保证,而且,如果没有重复的代码,代码会看起来更好。

您可以使用如下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

您可以使用如下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

您可能会将计算移动到tpdd子查询中,或者将tpdd查询转换为内联视图并添加该视图。但是,我不希望Oracle的任何模糊的最新版本会重新计算函数调用。您可能会将计算移动到tpdd子查询中,或者将tpdd查询转换为内联视图并添加它。但是,我不希望任何Oracle的最新版本会重新计算函数调用。